我有一个列类,它使用视图模型库来实现INotifyPropertyChanged
(懒惰我知道):
public class Column : ViewModelBase
{
public string ColumnName { get; set; }
public bool Anonymize { get; set; }
}
然后列出一列:
public class Columns : ObservableCollection<Column>
{
}
在我的视图模型中,我有一个属性列,我将它绑定到带有复选框和文本块的组合框:
private Columns _tableColumns;
public Columns TableColumns
{
get
{
return _tableColumns;
}
set
{
_tableColumns = value;
OnPropertyChanged("TableColumns");
}
}
<ComboBox Name="cbColumns" ItemsSource="{Binding TableColumns}">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding Anonymize, Mode=TwoWay}" />
<TextBlock Text="{Binding ColumnName}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
当我通过项目上的复选框更改Anonymize属性时,如何在视图模型中更改Columns属性以反映这一点?
答案 0 :(得分:3)
您的Column
课程需要实施INotifyPropertyChanged
(您说它确实如此)。当Anonymize
的值发生变化(你没有变化)时,你还需要引发该事件。
答案 1 :(得分:0)
如果您只想从UI更改Anonymize
属性,那么您就完成了。如果您想在UI上看到更改(来自后端),则必须在INotifyPropertyChanged
类中实现Column
接口。
public class Column : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public string columnName;
public bool anonymize;
public string ColumnName
{
get { return columnName; }
set
{
columnName = value; RaiseOnPropertyChanged("ColumnName");
}
}
public bool Anonymize
{
get { return anonymize; }
set { anonymize = value; RaiseOnPropertyChanged("Anonymize"); }
}
public void RaiseOnPropertyChanged(string propertyName)
{
var eh = PropertyChanged;
if (eh != null)
eh(this, new PropertyChangedEventArgs(propertyName));
}
}
答案 2 :(得分:0)
当Anonymize
状态发生变化时,需要通知视图模型需要修改列集合。我之前解决这个问题的方法是将CheckChanged事件添加到Anonymize
时引发的Column类。视图模型在创建Column对象后订阅该事件,但它被添加到Columns
集合中。引发CheckChanged时,视图模型会添加/删除Columns集合中的项目。