我有一个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;
}
}
}
答案 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"));
}
}
}