【问题标题】:WPF binding selected item in datagrid to a second datagrid and show value depending of itWPF将数据网格中的选定项目绑定到第二个数据网格并根据它显示值
【发布时间】:2018-06-18 19:15:09
【问题描述】:

我有两个 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,它们有更多的数据网格列。

【问题讨论】:

  • 这很令人困惑。你是说ItemsDg1ItemsDg2 包含相同数量的项目,ItemsDg2 中的每个项目对应于ItemsDg1 中相同索引的项目?如果是这样,你为什么要这样构建它?
  • @MikeStrobel 否,ItemsDg1 和 ItemsDg2 的项目数不同。
  • 在我修复了无法编译的内容(Class,该名称空间中没有 DataGrid)和无法运行的内容(在您的版本中,您在调用 _type.Equals() 之前,不能将 _type 设置为非 null)。无论您在实际代码中遇到什么问题,都可以在创建此示例时修复它。或者您实际上是在使用不同的 DataGrid 控件吗?如果是这样,我在哪里可以找到它进行测试?

标签: wpf mvvm binding datagrid datagridtextcolumn


【解决方案1】:

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

<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>

【讨论】:

  • 我已经完成了,但它不起作用。我添加了一个转换器来将 SelectedItem.Type 传递给它。此转换器返回 True 或 False。然后,我没有将值与 DataTrigger 中的“I”进行比较,而是将其与“True”进行比较。我已经看到 SelectedItem.Type 没有被触发,因为我在转换器中放置了一个断点并且它永远不会停止。示例:
  • @user1624552 您是否在运行时更改了Type 属性?如果是这样,您需要让您的项目类实现 INotifyPropertyChanged 并在属性更改时引发 PropertyChanged 事件,否则绑定将不知道它需要重新评估。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 2011-01-31
  • 2017-05-14
  • 2018-10-25
  • 1970-01-01
  • 2012-11-21
相关资源
最近更新 更多