DataGrid.RowStyle 仅适用于初始绑定

Posted

技术标签:

【中文标题】DataGrid.RowStyle 仅适用于初始绑定【英文标题】:DataGrid.RowStyle only works on initial binding 【发布时间】:2015-06-30 15:37:55 【问题描述】:

我有一个 DataTrigger 将样式应用于 DataGrid 行的 Visibility 属性。 DataTrigger 在 DataGrid 的初始绑定上工作得很好(即 ​​- 如果 FilteredOut 为真,它将行可见性设置为折叠)。

我有一个 ComboBox,它根据用户在 ComboBox 中选择的内容将 ObservableCollection AllPartMalfunctions 中的每个项目的 FilteredOut 属性设置为 true 或 false。 p>

这是我的问题:在 ComboBox 中选择一个项目并为每个项目设置 FilteredOut 属性后,DataGrid 行不会刷新为可见或折叠,并且UI 上的所有内容看起来都与在 ComboBox 中选择任何内容之前相同。我错过了什么?

这是 XAML:

<DataGrid ItemsSource="Binding AllPartMalfunctions"
          AutoGenerateColumns="False" Width="Auto">
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Style.Triggers>
                <DataTrigger Binding="Binding FilteredOut, Mode=TwoWay" Value="True">
                    <Setter Property="Visibility" Value="Collapsed" />
                </DataTrigger>
                <DataTrigger Binding="Binding FilteredOut, Mode=TwoWay" Value="False">
                    <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowStyle>
    <DataGrid.Columns>
         <!--removed for brevity-->
    </DataGrid.Columns>
</DataGrid>

这是 DataGrid 所绑定的 ViewModel:

public class Malfunctions : ViewModelBase 
       public ObservableCollection<Model.PartMalfunction> AllPartMalfunctions 
            get;
            private set;
        

这是零件故障模型:

public class PartMalfunction 
    private bool _filteredOut = false;
    public bool FilteredOut 
            get 
                return _filteredOut;
            
            set 
                _filteredOut = value;
            
        
    

【问题讨论】:

【参考方案1】:

“PartMalfucntion”类需要实现 System.ComponentModel.INotifyPropertyChanged 并在 FilteredOut 的值发生更改时触发 PropertyChanged 事件。

public class PartMalfunction : System.ComponentModel.INotifyPropertyChanged

    #region INotifyPropertyChanged Members
    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    #endregion

    private bool _filteredOut = false;
    public bool FilteredOut
    
        get 
            return _filteredOut;
        
        set 
            _filteredOut = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("FilteredOut"));
        
    

【讨论】:

这正是我所需要的。由于这样的有用答案,WPF 对我来说每天都变得不那么神秘了。非常感谢,JH!!

以上是关于DataGrid.RowStyle 仅适用于初始绑定的主要内容,如果未能解决你的问题,请参考以下文章

WPF datagrid.rowstyle 绑定

Wpf DataGrid RowStyle 如何使用图像或画笔作为背景

DataGrid RowStyle - DataTrigger 中的绑定值

警告:扩展初始化列表仅适用于 -std=c++11 或 -std=gnu++11 [默认启用]

删除所有 DataGrid 行和单元格边框

STM32H723- DMA DAC 仅适用于 const 吗?