INotifyPropertyChanged - 事件保持为空

时间:2013-08-28 09:50:01

标签: c# wpf inotifypropertychanged

我正在尝试实现以下INotifyPropertyChanged扩展:

Automatically INotifyPropertyChanged(接受回答) http://ingebrigtsen.info/2008/12/11/inotifypropertychanged-revisited/

但我无法弄清楚为什么我的PropertyChanged EventHandler保持为null。 :(

我做了一个非常简单的WPF应用程序来测试它,这是我的XAML代码:

<StackPanel Orientation="Vertical">
    <TextBox Text="{Binding Path=SelTabAccount.Test, UpdateSourceTrigger=PropertyChanged}"></TextBox>
    <TextBox Text="{Binding Path=SelTabAccount.TestRelated, UpdateSourceTrigger=PropertyChanged}"></TextBox>
</StackPanel>

我的代码背后:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private TabAccount _selTabAccount;

    public TabAccount SelTabAccount
    {
        get { return _selTabAccount; }
        set
        {
            _selTabAccount = value;
            PropertyChanged.Notify(() => this.SelTabAccount);
        }
    }

    public MainWindow()
    {
        InitializeComponent();

        SelTabAccount = new TabAccount()
        {
            Test = "qwer",
            TestRelated = ""
        };
    }
}

public partial class TabAccount : INotifyPropertyChanged
{
    private string _test;

    public string Test
    {
        get { return _test; }
        set
        {
            _test = value;
            PropertyChanged.Notify(() => this.Test);
            PropertyChanged.Notify(() => this.TestRelated);
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

public partial class TabAccount
{
    private string _testRelated;

    public string TestRelated
    {
        get
        {
            _testRelated = Test + "_Related";
            return _testRelated;
        }
        set
        {
            _testRelated = value;
            PropertyChanged.Notify(() => this.TestRelated);
        }
    }
}

在后面的代码中,您将看到一个类(它只是随机测试的部分),它有2个属性,应该通知属性更改但没有任何反应。

NotificationExtension是顶部提供的链接的复制和粘贴,位于外部cs文件中。

我也尝试使用“普通”的INotifyPropertyChanged实现进行示例,这可以按预期工作,但我不能在这个扩展类中实现。

希望你能帮助我解决这个问题。 提前谢谢。

2 个答案:

答案 0 :(得分:4)

仅当您向可视对象提供某些数据源时,绑定才有效。如果您不提供任何数据源并且想要深入了解属性,则绑定将不起作用。

在MainWindow构造函数下,将Window的DataContext属性设置为数据源。例如:

 public MainWindow()
 {
    InitializeComponent();

   // your property setups

    this.DataContext = this; 
 }

基本上,这使得MainWindow属性可用于绑定到MainWindow项目的可视树。

答案 1 :(得分:1)

您必须设置Window的DataContext。您可以在初始化组件之后在窗口的construnctor中执行此操作。

this.DataContext = this;

这应该可以解决问题。

由于