C# 为什么可以';我绑定到WPF中类上的字段,而不是绑定到属性

C# 为什么可以';我绑定到WPF中类上的字段,而不是绑定到属性,c#,.net,wpf,binding,C#,.net,Wpf,Binding,在WPF中,我似乎无法绑定到对象上的公共字段,而只能绑定到公共属性。这是WPF有意做出的设计决定,还是我只是弄错了语法 下面是一个示例片段: public class User { public string Username; public string FullName; public string DisplayName { get { return FullName; } } } WPF代码段: <Window xmlns="http://schema

在WPF中,我似乎无法绑定到对象上的公共字段,而只能绑定到公共属性。这是WPF有意做出的设计决定,还是我只是弄错了语法

下面是一个示例片段:

public class User
{
  public string Username;
  public string FullName;
  public string DisplayName
  {
    get { return FullName; }
  }
}
WPF代码段:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="User Tool" >
  <Window.Resources>
    <DataTemplate x:Key="UserTemplate">
      <TextBlock Text="{Binding Path=DisplayName}" />
    </DataTemplate>
  </Window.Resources>
  <ListBox Name="listBoxUsers" ItemTemplate="{StaticResource UserTemplate}" ItemsSource="..." />
</Window>


如果我将绑定路径更改为用户名或全名,屏幕上不会显示任何内容。是否有其他语法可以绑定到字段,或者只允许在属性上绑定?

似乎它必须是属性

绑定的源可以是任何 公共财产,包括财产 其他控件的通用语言 运行时(CLR)对象、XAML元素、, ADO.NET数据集、XML片段和 诸如此类


字段不属于

公共语言运行库(CLR)对象

您可以绑定到公共属性, 子属性以及索引器, 任何公共语言运行库(CLR)的 对象绑定引擎使用CLR 反射以获取 财产。或者,选择对象 实现ICustomTypeDescriptor的 或者有一个注册的 TypeDescriptionProvider也可以与 装订机

有关如何 实现一个可以作为 绑定源,请参阅实现 在中稍后为绑定源初始化 这个话题

动态对象

您可以绑定到可用的属性 和一个对象的索引器 实现 IDynamicMetaObjectProvider接口。 如果您可以在代码中访问成员, 你可以约束它。例如,如果 动态对象使您能够访问 代码中的成员通过 你可以绑定到某个属性 通过将绑定路径设置为 财产

ADO.NET对象

您可以绑定到ADO.NET对象,例如 作为数据表。ADO.NET数据视图 实现IBindingList接口, 它提供更改通知 绑定引擎侦听的

XML对象

您可以绑定并运行XPath查询 在XmlNode、XmlDocument或 XmlElement。一种方便的访问方式 中作为绑定源的XML数据 标记将使用XmlDataProvider 对象有关更多信息,请参见如何 to:使用 XMLDataProvider和XPath查询

也可以绑定到XElement或 XDocument,或绑定到 查询在这些类型的对象上运行 通过使用LINQ转换为XML。便道 使用LINQ to XML访问XML数据 这是标记中的绑定源 是使用ObjectDataProvider 对象有关更多信息,请参见如何 到:绑定到XDocument、XElement或 用于XML查询结果的LINQ

依赖对象对象

您可以绑定到依赖项属性 任何DependencyObject的。为了 示例,请参见如何:绑定 两个控件的属性


正如答案所说,它必须是一种财产。无论如何,通过属性使字段私有和公开是“更好的OO编程”(信息隐藏等)。此外,它还可以编写诸如DependencyProperties之类的内容,实现INotifyPropertyChanged,以及其他类似的好东西。我处理的具体案例是使用FileHelpers库从CSV填充项目,FileHelpers似乎不支持将引用字段填充到属性中,这迫使我使用字段。关于更好的OO,你肯定是对的,只是在这种情况下很笨拙。