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

5
我有一个关于 WPF 中绑定如何工作的问题。
如果我有一个具有以下属性的视图模型:
private string testString;
public string TestString
{
    get { return testString; }
    set { testString = value; }
}

那么,如果我将它绑定到一个 XAML 上,类似于这样:
<TextBlock
    Text="{Binding Path=TestString, Mode=TwoWay}"
    Foreground="Red"
    HorizontalAlignment="Center"
    VerticalAlignment="Center"
    FontFamily="Calibri"
    FontSize="24"
    FontWeight="Bold">
</TextBlock>

它可以工作...没有什么新东西。
然而,如果我从测试字符串中删除获取器和设置器,最后得到类似这样的内容:
public string TestString;

同样的绑定不起作用。我不知道这是为什么,因为对我来说,这相当于具有自定义 get 和 set 的公共属性的公共属性。
有人能为我解释一下这个问题吗?:)
提前谢谢!!
PS:很抱歉我的语法高亮。我只是无法弄清楚如何使用代码块。
3个回答

3

移除getter和setter会将TestString成员从属性更改为字段。这就是为什么绑定停止工作,而且可能不是您想要的(像这样的公共字段通常被认为是不良设计)。

您可以通过声明空的getter/setter让编译器自动创建支持字段,如下所示:

public string TestString { get; set; }

你说的是对的。我最终也做到了,但在此之前,我浪费了几个小时试图理解发生了什么。我只是不明白为什么getter/setter的存在与否会将字段变成属性。我想这可能是编译器在编译时所做的事情。感谢您的关注! - Silva
1
@Silva 这是因为你使用了字段的语法。C#语言是这样构建的,以区分属性和字段声明。 - Mårten Wikström
1
@Silva:未来,与其“花费数小时苦思冥想”,不如使用输出窗口来调试绑定错误。此外,快速的谷歌搜索会带你到这篇文章 - Ed S.

2

2
@Silva,你的直觉是正确的,幕后确实有些事情正在发生。我只在Pete Brown(微软开发者宣传员)的博客中看到了这个问题得到明确解决:

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));
    }
}

我很惊讶地发现,如果不实现接口,性能会降低4倍。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接