1

I have a column class which uses view model base to implement INotifyPropertyChanged (lazy I know):

public class Column : ViewModelBase
{
    public string ColumnName { get; set; }
    public bool Anonymize { get; set; }
}

And then a list of columns:

public class Columns : ObservableCollection<Column>
{
}

In my view model I have a property columns and I am binding that to a combo box with a checkbox and textblock:

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>

When I change the Anonymize property through the checkbox on an item, how do make the Columns property change in the view model to reflect this?

4

3 に答える 3

3

あなたのColumnクラスは実装する必要がINotifyPropertyChangedあります(あなたはそれがそうすると言います)。また、値が変更されたときにそのイベントを発生させる必要がありAnonymizeます(変更しません)。

于 2012-08-03T11:14:20.177 に答える
0

AnonymizeUI からのみプロパティを変更する場合は、これで完了です。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 イベントを Column クラスに追加することですAnonymize。ビュー モデルは、Column オブジェクトを作成した後にイベントをサブスクライブしますが、Columnsコレクションに追加されます。CheckChanged が発生すると、ビュー モデルは Columns コレクションから項目を追加/削除します。

于 2012-08-03T13:11:19.400 に答える