【发布时间】:2014-12-20 04:15:16
【问题描述】:
我有 2 个主要课程。第一个类表示一个可以具有值 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));
}
}
}
第二个类包含这个类的一个对象,也被设置为我的主窗口的数据上下文。
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 中,我使用如下按钮样式绑定到板上的 Cell 对象:
<Setter Property="Background" Value="{Binding TestCell,
Converter={StaticResource BGConverter}}"/>
BGConverter 是一个自定义转换器,它接受 Cell 对象并将其转换为 Colors 对象。我相信我确实直接绑定到实现了 INotify 的对象,因此不存在嵌套对象的问题。但是,当我单击时,绑定不会反映更改。调试的时候发现PropertyChanged事件一直为null。
我为此找到的最接近的答案是,只有当类 Cell 是我的数据上下文时,才会订阅该事件。至少我是这么理解的。我该如何解决这个问题?
另外,我刚从大学毕业,目前正在学习 WPF 的新工作,因此也欢迎任何一般性建议。 谢谢
【问题讨论】:
-
TestCell属性未与INotifyPropertyChanged一起实现。所以Converter不会被调用来更新值。我不认为按钮的背景和TestCell之间存在一些引用关系。因此,更改TestCell的任何属性都不会反映对Background的某些更改。 -
@KingKing:正如下面的回答者所建议的,我也尝试在 Board 类上实现 INotify,但它仍然不起作用
-
@KingKing:找到了解决方案。我必须绑定到 TestCell.State 而不是 TestCell。你的评论让我想到了这个思路。谢谢:)
-
这意味着您的
Converter将接受Symbol而不是Cell。我的建议也应该有效,你为它实现了 INotifyPropertyChanged 但是你也应该提高 PropertyChanged 当你改变状态时(虽然状态发生了变化,但是我们应该通知Cell发生了变化)。那么它应该可以工作了。 -
@KingKing 我想知道如何以更 MVVM 的方式做到这一点。非常感谢您的建议。我只是尝试实现它。有一些问题,因为在我的实际场景中,我正在处理一组对象而不是单个对象。不过,我会想办法的。谢谢:)
标签: c# wpf inotifypropertychanged