WPF 中的绑定问题 - 属性和字段之间的区别

Sil*_*lva 5 c# wpf xaml binding

我有一个关于绑定如何在 WPF 中工作的问题。

如果我有一个具有这样属性的视图模型:

private string testString;
public string TestString
{
    get { return testString; }
    set { testString = value; }
}
Run Code Online (Sandbox Code Playgroud)

然后,如果我将它绑定到一个 xaml,如下所示:

<TextBlock
    Text="{Binding Path=TestString, Mode=TwoWay}"
    Foreground="Red"
    HorizontalAlignment="Center"
    VerticalAlignment="Center"
    FontFamily="Calibri"
    FontSize="24"
    FontWeight="Bold">
</TextBlock>
Run Code Online (Sandbox Code Playgroud)

它有效......这里没有什么新东西。

但是,如果我从测试字符串中删除 getter 和 setter 并最终得到如下结果:

public string TestString;
Run Code Online (Sandbox Code Playgroud)

完全相同的绑定不起作用。我不知道为什么会发生这种情况,因为对我来说,它相当于具有自定义 get 和 set 的公共属性的公共属性。

有人可以为我解释一下这个主题吗?:)

提前TYVM!

PS:抱歉我的语法高亮。我只是不知道如何使用代码块。

Ken*_*ick 2

@Silva,你的预感是正确的,幕后发生了一些事情。我只在 Pete Brown(Microsoft 开发人员传播者)博客上看到的一篇博客文章中清楚地解决了这个问题:

http://10rem.net/blog/2010/12/17/puff-the-magic-poco-binding-and-inotifypropertychanged-in-wpf

查看他写的有关课程的部分PropertyDescriptor。他还继续提到,与使用INotifyPropertyChanged在视图模型类上实现接口的更传统方法相比,它的效率相对较低,如下所示:

private string testString;

public string TestString
{
    get { return testString; }
    set {
        if (testString != value) {
            testString = value;
            RaisePropertyChanged("TestString");
        }
    }
}

public event PropertyChangedEventHandler PropertyChanged;

private void RaisePropertyChanged(string propertyName)
{
    if (PropertyChanged != null) {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
Run Code Online (Sandbox Code Playgroud)

我非常惊讶地发现,由于不实现该接口,性能下降了 4 倍。