【问题标题】:DataGrid.RowStyle only works on initial bindingDataGrid.RowStyle 仅适用于初始绑定
【发布时间】: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;
            }
        }
    }

【问题讨论】:

    标签: wpf mvvm wpfdatagrid datatrigger


    【解决方案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!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 2014-03-02
    • 2015-06-16
    • 2011-05-18
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    相关资源
    最近更新 更多