繁体   English   中英

WPF:在列表外绑定 DataGrid

[英]WPF : binding DataGrid outside the list

<Grid Background="white" Margin="0,0,0,0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">

    <Label Content="Physical Test" Margin="0,0,0,0" FontSize="12" FontWeight="DemiBold"
           HorizontalAlignment="Left"  VerticalAlignment="Top" />
    <ComboBox Height="22" Margin="90,0,0,0"
              HorizontalAlignment="Left"  VerticalAlignment="Top" 
              ItemsSource="{Binding physicalTestList, Mode=OneWay}" SelectedItem="{Binding selectedPhysicalTest}"
              DisplayMemberPath="physicalTestName" SelectedValuePath="physicalTestID"/>


    <Button Content="Refresh" 
            HorizontalAlignment="Left"  VerticalAlignment="Top" 
            Margin="200,0,0,0" Width="70" Height="22"
            Command="{Binding buttonRefresh}"    IsEnabled="{Binding RefreshEnable, Mode=OneWay}"/>
     
    <CheckBox Margin="300,5,0,0" HorizontalAlignment="Left"
              Content="Confirmed?"
              IsChecked="{Binding IsConfirmed, Mode=OneWay}"
              Command="{Binding buttonConfirm}" IsEnabled="{Binding ConfirmEnable, Mode=OneWay}"
              />
    

    <Grid>  
        <DataGrid  x:Name="theGrid" IsVisibleChanged="OnIsVisibleChanged"
                   Margin="0,30,0,0" HorizontalAlignment="Stretch"  VerticalAlignment="Stretch" 
                   AutoGenerateColumns="False"  CanUserAddRows="False"  IsReadOnly="False"  
                   ItemsSource="{Binding theList, Mode=OneWay}"
                   >
            <DataGrid.Resources>
                <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Navy"/>
                <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="SteelBlue"/>
            </DataGrid.Resources>
            <DataGrid.Columns>
                <DataGridTextColumn Header="Well"  Binding="{Binding well}" IsReadOnly="True" />
                <DataGridTextColumn Header="Control"  Binding="{Binding controlName}"  IsReadOnly="True" />
                <DataGridTextColumn Header="Type"  Binding="{Binding display}"  IsReadOnly="True" />
                <DataGridTemplateColumn Header="Value" IsReadOnly="True" >
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Label Content="{Binding processedValue }" 
                                   Background="{Binding valueColor}"  />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTextColumn Header="Min"  Binding="{Binding minDisplay }"  IsReadOnly="True" />
                <DataGridTextColumn Header="Max"  Binding="{Binding maxDisplay }"  IsReadOnly="True" />
                <DataGridCheckBoxColumn Header="Omit For SPC?" Binding="{Binding isOutlier}" IsReadOnly="True" />

            </DataGrid.Columns>
        </DataGrid>

        

    </Grid>

</Grid>

我有 Checkbox 对象的属性 IsChecked 正确,使用以下

IsChecked="{Binding IsConfirmed, Mode=OneWay}"

在 DataGrid“theGrid”中,如果 IsConfirmed = true,我想让最后一列的 ReadOnly 属性为 TRUE。 所以基本上我希望该列的行为就像 DataGrid 之外的复选框一样。

此时我有

<DataGridCheckBoxColumn Header="Omit For SPC?" Binding="{Binding isOutlier}" IsReadOnly="True" />

我试图将其更改为

<DataGridCheckBoxColumn Header="Omit For SPC?" Binding="{Binding isOutlier}" IsReadOnly="{Binding IsConfirmed, Mode=OneWay}" />

但没有用。

任何指针将不胜感激!

在这种情况下,您应该在binding中使用RelativeSource

例如:

<DataGridCheckBoxColumn Header="Omit For SPC?" Binding="{Binding isOutlier}" IsReadOnly="{Binding IsConfirmed, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type typeOfAncestor}} Mode=OneWay}" />

其中typeOfAncestor是在其DataContext模型中具有IsConfirmed属性的控件类型。

它没有用。 这就是我现在所拥有的。

<DataGridCheckBoxColumn Header="Omit For SPC?" Binding="{Binding isOutlier}" 
                        IsReadOnly="{Binding    IsConfirmed
                                                , RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type CheckBox}}
                                                , Mode=OneWay
                                                }" />

固定的。

您必须添加绑定对象

<DataGrid>
            <DataGrid.Resources>
                <util:BindingProxy x:Key="proxy" Data="{Binding}" />
            </DataGrid.Resources> 

那么这就是您使用“代理”引用的方式

 <DataGridCheckBoxColumn Header="Omit For SPC?" Binding="{Binding isOutlier}" 
             IsReadOnly="{Binding Data.IsConfirmed, Source={StaticResource proxy} }" />

请注意,您必须使用“数据”。 而不是“数据上下文”。 然后你需要创建那个“<util:”前缀

xmlns:util="clr-namespace:PCRPlating.util"

以下是“BindingProxy”类

    public class BindingProxy : Freezable
{
    #region Overrides of Freezable

    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }

    #endregion

    public object Data
    {
        get { return (object)GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Data.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM