1

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

4

3 回答 3

3

你的Column类需要实现INotifyPropertyChanged(你说它确实如此)。Anonymize当值发生变化时(您没有),您还需要引发该事件。

于 2012-08-03T11:14:20.177 回答
0

Anonymize如果您只想从 UI更改属性,那么您就完成了。如果您想在 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));
    }
}
于 2012-08-03T11:22:01.653 回答
0

Anonymize状态改变时,它需要通知视图模型它需要修改列的集合。我之前解决此问题的方法是将 CheckChanged 事件添加到Anonymize. 视图模型在创建 Column 对象后订阅事件,但它被添加到Columns集合中。当 CheckChanged 被引发时,视图模型从 Columns 集合中添加/删除项目。

于 2012-08-03T13:11:19.400 回答