Itemssource中项目的Datagrid Propertychange不会更新Datagrid

时间:2017-11-28 13:04:45

标签: c# wpf xaml datagrid

我的Datagrid存在问题。如果我在我的源类中修改了一个属性,它就不会更新。

这是在xaml中完成对源(List)的绑定:

<DataGrid Name="dtgDecodedMsg"
                ItemsSource="{Binding Path=MsgTypGridLineListVar, UpdateSourceTrigger=PropertyChanged}" 

这是一个如何构建类的图片: Classes

简短说明: 我按一个按钮,这个按钮用我想要显示的信息填充MsgTypGridLineListVar。然后我调用OnPropertyChanged来更新Datagrid。这很有效!

private void button_click(object parameter) {
    this.MsgTypGridLineListVar = new List<CmsgTypGridLine>(); //Reset MsgTypGridLineListVar
    ... //Fill MsgTypGridLineListVar with information
    OnPropertyChanged("MsgTypGridLineListVar"); 
}

现在,我需要在填充DataGrid时更改某些单元格的可见性/文本。所以它应该只改变某些字段/行而不是新创建的。 所以我想的只是改变我想要的值,然后调用OnPropertyChanged("MsgTypGridLineListVar"); 试。

但这不起作用..如果我向下滚动该行不再可见,然后再向上滚动,它适用于单元格中的文本。但它对于可见性不起作用。

这是我创建的测试按钮:

private void testButton_click(object parameter)
{

  this.MsgTypGridLineListVar[0].ByteCell.CellValue = "TEST";
  this.MsgTypGridLineListVar[2].RowVisible = Visibility.Collapsed;
  OnPropertyChanged("MsgTypGridLineListVar");
}

如上所述,它适用于文本(如果我向下滚动)但不适用于可见性。 我必须立即更改更新。

这是我的Datagrid的xaml-Code,你可以看到我如何进行绑定:

<DataGrid Name="dtgDecodedMsg"
                CanUserSortColumns="False"
                CanUserAddRows="False"
                CanUserReorderColumns="False"
                HeadersVisibility="Column"
                IsTabStop="False"
                ClipboardCopyMode="IncludeHeader"
                SelectedIndex="{Binding DecodeSelectedGridIdx, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
                ItemsSource="{Binding Path=MsgTypGridLineListVar, UpdateSourceTrigger=PropertyChanged}" 
                AutoGenerateColumns="False" 
                Margin="10,111,10,0">
        <DataGrid.Columns>
          <DataGridCheckBoxColumn Header="..." Width="25">
            <DataGridCheckBoxColumn.CellStyle>
              <Style TargetType="{x:Type DataGridCell}">
                <Style.Triggers>
                  <Trigger Property="IsSelected" Value="True">
                    <Setter Property="BorderBrush" Value="LightBlue"/>
                    <Setter Property="BorderThickness" Value="2"/>
                  </Trigger>
                </Style.Triggers>
                <Setter Property="Background" Value="{Binding HideCell.CellColor}"/>
                <Setter Property="BorderBrush" Value="{Binding HideCell.CellColor}"/>
                <Setter Property="Focusable" Value="{Binding HideCell.CheckBoxEnabled}"/>
              </Style>
            </DataGridCheckBoxColumn.CellStyle>
            <DataGridCheckBoxColumn.ElementStyle>
              <Style TargetType="CheckBox">
                <Setter Property="Visibility" Value="{Binding HideCell.CheckBoxVisibility}"/>
                <Setter Property="IsChecked" Value="{Binding CheckBoxChecked,UpdateSourceTrigger=PropertyChanged}" />
              </Style>
            </DataGridCheckBoxColumn.ElementStyle>
          </DataGridCheckBoxColumn>
          <DataGridTextColumn Header="Value" Binding="{Binding ValueTelegramCell.CellValue}" IsReadOnly="True" Width="*">
            <DataGridTextColumn.CellStyle>
              <Style TargetType="{x:Type DataGridCell}">
                <Style.Triggers>
                  <Trigger Property="IsSelected" Value="True">
                    <Setter Property="BorderBrush" Value="LightBlue"/>
                    <Setter Property="BorderThickness" Value="2"/>
                  </Trigger>
                </Style.Triggers>
                <Setter Property="Foreground" Value="{Binding ValueTelegramCell.TextColor}"/>
                <Setter Property="Background" Value="{Binding ValueTelegramCell.CellColor}"/>
                <Setter Property="BorderBrush" Value="{Binding ValueTelegramCell.CellColor}"/>
              </Style>
            </DataGridTextColumn.CellStyle>
          </DataGridTextColumn>
        </DataGrid.Columns>
        <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                <Setter Property="Visibility" Value="{Binding MsgTypGridLineListVar.RowVisible, UpdateSourceTrigger=PropertyChanged}"/>
            </Style>
        </DataGrid.RowStyle>
      </DataGrid>

1 个答案:

答案 0 :(得分:1)

直接绑定到RowVisible的{​​{1}}属性:

CmsgTypGridLine

...并确保<DataGrid.RowStyle> <Style TargetType="DataGridRow"> <Setter Property="Visibility" Value="{Binding RowVisible}"/> </Style> </DataGrid.RowStyle> 类实现CmsgTypGridLine接口并在INotifyPropertyChanged属性的setter中引发更改通知。