嵌套对象中的INotifyPropertyChanged

时间:2014-10-24 10:15:23

标签: c# wpf inotifypropertychanged

我有两个主要课程。第一个类表示可以具有值X,O或Empty的Cell。我已在此实现了INotifyPropertyChanged。

public class Cell : INotifyPropertyChanged
{
    private Symbol state;

    public Symbol State
    {
        get { return state; }
        set
        {
            if (value == Symbol.X || value == Symbol.O)
                state = value;
            OnPropertyChanged("State");
        }
    }

    public Cell()
    {
        state = Symbol.Empty;
    }

    public enum Symbol
    {
        X, O, Empty
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
    }
}

第二个类包含此类的对象,并且还被设置为主窗口的datacontext。

public class Board
{  
    private Cell testCell;

    public Cell TestCell
    {
        get { return testCell; }
        set { testCell = value; }
    }

    public Board()
    {
        TestCell = new Cell();
    }

    public void Cell_Click(int cellNum)
    {
        TestCell.State = Cell.Symbol.O;
    }
}

在我的主窗口中,我将datacontext设置为board,并且还包含button_click函数。

 public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new Board();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Board board = this.DataContext as Board;
        board.Cell_Click(cellNum);
    }
}

在我的XAML中,我使用这样的按钮样式绑定到Board中的Cell对象:

<Setter Property="Background" Value="{Binding TestCell, 
                                      Converter={StaticResource BGConverter}}"/>

BGConverter是一个自定义转换器,它接受一个Cell对象并将其转换为Colors对象。我相信我确实直接绑定到已实现INotify的对象,因此没有嵌套对象的问题。但是,当我点击时,绑定并不反映变化。调试时,我发现PropertyChanged事件始终为null。

我找到的最接近的答案是,只有当Cell类是我的datacontext时,才会订阅该事件。至少这是我所理解的。我该如何纠正这个问题?

此外,我刚从大学毕业,目前在新工作上学习WPF,所以欢迎任何一般性建议。 感谢

2 个答案:

答案 0 :(得分:1)

只需绑定到TestCell.State而不是TestCell

答案 1 :(得分:0)

我自己也很陌生,但我相信你的数据上下文也需要实现INotifyPropertyChanged。 也就是说,当发生这种情况时,你的Board类需要监听单元格的PropertyChanged事件并触发它自己的PropertyChanged事件。