【问题标题】:INotifyPropertyChanged in nested object嵌套对象中的 INotifyPropertyChanged
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我尝试在 Board 类上实现它并在 TestCell 更改时触发它。但它不起作用。
    • 在调用Board的OnPropertyChanged方法时,是否确定传递“TestCell”作为更改属性的名称?
    • 是的,传递的名称是正确的。不过我确实找到了答案。我必须绑定到 TestCell.State 而不是 TestCell :)
    猜你喜欢
    • 2011-05-07
    • 1970-01-01
    • 2018-09-06
    • 2018-10-12
    • 2011-11-26
    • 2014-05-06
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多