WPF将datagrid中的选定项绑定到第二个数据网格,并根据它显示值

时间:2018-01-09 17:19:27

标签: wpf mvvm binding datagrid datagridtextcolumn

我有两个WPF数据网格。当从第一个数据网格dg1中选择一行时,第二个数据网格中名为“注释”的列dg2应仅显示为空字符串,并且仅当dg1中所选行的“注释类型”列的内容相等时才显示到“我”。否则,dg2中“Notes”列的内容应该是来自Notes的集合ItemsDg2中的内容。

我的问题是,当值为“I”时,dg1中“Note Type”列的内容显示在dg2的“Notes”列中,而不是显示空字符串。

<Window x:Name="MainWindow"
        xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" 
        xmlns:sys="clr-namespace:System;assembly=mscorlib">


   <my:DataGrid Name="dg1" ItemsSource="{Binding Path=ItemsDg1}">
       <my:DataGrid.Columns>
          <my:DataGridTextColumn x:Name="iType" Binding="{Binding Path=Type}" Header="Note Type"/>
       </my:DataGrid.Columns>   
   </my:DataGrid>

   <my:DataGrid Name="dg2" ItemsSource="{Binding Path=ItemsDg2}">      
       <my:DataGrid.Columns>
            <my:DataGridTextColumn Binding="{Binding Path=Notes}" Header="Notes">
                <my:DataGridTextColumn.ElementStyle>
                    <Style TargetType="{x:Type TextBlock}">                                       
                        <Setter Property="Text" Value="{Binding Path=Notes}"></Setter>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding SelectedItem.Type, ElementName=dg1}" Value="I">
                                <Setter Property="Text" Value="{x:Static sys:String.Empty}"></Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </my:DataGridTextColumn.ElementStyle>
            </my:DataGridTextColumn>
        </my:DataGrid.Columns>          
   </my:DataGrid>

</Window>

ItemsDg1是It1的列表

ItemsDg2是It2的列表

public Class It1
{

    private string _type;
    public string Type
    {
        get { return _type; }
        set
        {
            if (!_type.Equals(value))
            {
                _type = value;
            }
        }
    }

}

public Class It2
{

    private string _notes;
    public string Notes
    {
        get { return _notes; }
        set
        {
            if (!_notes.Equals(value))
            {
                _notes = value;
            }
        }
    }

}

类It1和It2有更多属性,但我只在这里显示理解场景的最小值。这同样适用于dg1和dg2,它们有更多的datagrid列。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您应该通过替换Notes中的dg2列定义来获得所需的结果,如下所示:

<DataGridTemplateColumn Header="Notes">
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
      <TextBlock x:Name="CellText" Text="{Binding Notes}" />
      <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding SelectedItem.Type, ElementName=dg1}" Value="I">
          <Setter TargetName="CellText" Property="Text" Value="" />
        </DataTrigger>
      </DataTemplate.Triggers>
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>