可观察的集合项属性已更改

时间:2012-08-03 11:05:45

标签: c# .net wpf xaml mvvm

我有一个列类,它使用视图模型库来实现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属性以反映这一点?

3 个答案:

答案 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集合中的项目。