DataGrid.RowStyle仅适用于初始绑定

时间:2015-04-22 19:06:48

标签: wpf mvvm wpfdatagrid datatrigger

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

我有一个ComboBox,可以为ObservableCollection AllPartMalfunctions 中的每个项目设置 FilteredOut 属性为true或false,具体取决于用户在ComboBox中选择的内容。

以下是我的问题:在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;
        }
}

这是PartMalfunction模型:

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

1 个答案:

答案 0 :(得分:2)

类“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"));
        }
    }
}