C# 可观察集合项属性已更改
我有一个column类,它使用视图模型库来实现C# 可观察集合项属性已更改,c#,.net,wpf,xaml,mvvm,C#,.net,Wpf,Xaml,Mvvm,我有一个column类,它使用视图模型库来实现INotifyPropertyChanged(我知道): 然后是列列表: public class Columns : ObservableCollection<Column> { } 当我通过项上的复选框更改匿名属性时,如何使视图模型中的Columns属性更改以反映这一点?您的Column类需要实现INotifyPropertyChanged(您说是这样的)。当Anonymize的值更改时,您还需要引发该事件。如果您只想从UI更改
INotifyPropertyChanged
(我知道):
然后是列列表:
public class Columns : ObservableCollection<Column>
{
}
当我通过项上的复选框更改匿名属性时,如何使视图模型中的Columns属性更改以反映这一点?您的
Column
类需要实现INotifyPropertyChanged
(您说是这样的)。当Anonymize
的值更改时,您还需要引发该事件。如果您只想从UI更改Anonymize
属性,则操作完成。如果希望在UI上查看更改(从后端),则必须在列
类中实现INotifyPropertyChanged
接口
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));
}
}
当“匿名化”状态更改时,需要通知视图模型需要修改列集合。我以前解决这个问题的方法是向列类中添加一个CheckChanged事件,该事件在
匿名化时引发。视图模型在创建Column对象后会订阅该事件,但会将其添加到Columns
集合中。当提出CheckChanged时,视图模型会从Columns集合中添加/删除该项。您是否尝试过双向绑定模式?视图模型中的Columns属性到底是什么?我只能看到类型为Columns
的TableColumns
属性。您想更改该属性,还是想更改当前列
对象的匿名化
属性?+1但问题是“当我更改匿名化属性(例如,在代码中)时,如何使视图反映此更改?”。有人反过来问我,我一点也不明白。嗯,你说得对——我可能完全没有抓住要点!也就是说,如果这是OP所需要的,那么我不确定为什么发布的标记不起作用。困惑的嗯,我不能说今天是星期五吗。这个问题太愚蠢了,甚至我都不知道我为什么问它,我现在有我需要的了,非常感谢。这正是以前得到的答案。
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>
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));
}
}