我有两个主要课程。第一个类表示可以具有值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,所以欢迎任何一般性建议。 感谢
答案 0 :(得分:1)
只需绑定到TestCell.State而不是TestCell
答案 1 :(得分:0)
我自己也很陌生,但我相信你的数据上下文也需要实现INotifyPropertyChanged。 也就是说,当发生这种情况时,你的Board类需要监听单元格的PropertyChanged事件并触发它自己的PropertyChanged事件。