如何将ItemsSource绑定到私有属性

10

如何将WPF的ItemsSource绑定到一个私有属性?

<ComboBox x:Name="xxx" ItemsSource="{Binding Items, Mode=OneWay}"
          DisplayMemberPath="ItemName"/>
public partial class ItemBuySellAddEdit : BasePage
{
    private List<Item> Items { get; set; }
}

表单加载时,项目列表将被填充。


公共/内部与绑定一起工作。 - RainCast
4个回答

22

WPF中的数据绑定仅适用于公共属性。

MSDN:

您作为绑定源属性使用的属性必须是类的公共属性。不能访问显式定义的接口属性以供绑定目的,也不能访问没有基本实现的受保护、私有、内部或虚拟属性。


3
请使用ObservableCollection<T>而不是List<T>。 - Stephan Bauer

4

如果你真的非常想这样做,你需要提供一个自定义类型描述符,通过实现 ICustomTypeDescriptor 来提供额外的属性,以及通过一个定制的 PropertyDescriptor 提供常规公共属性。你可以在类型本身上实现此接口,或者通过 TypeDescriptionProvider 实现;后者更受欢迎,因为它适用于更多的场景(例如空列表,无需提供具有 ITypedList 实现的定制列表)。这是一项很多工作,除非是极端情况下,否则真的不值得这么做。但它是可以完成的。


1

您需要一个相对源绑定,目前您的绑定是到您的ItemBuySellAddEdit(FrameworkElement)的DataContext。至少这是我的印象,因为您正在使用partial。如果它是ViewModel,请检查输出窗口,并查看是否有任何绑定错误。

<ComboBox 
    x:Name="xxx" 
    ItemsSource="{Binding Items, 
        RelativeSource={RelativeSource AncestorType={x:Type ItemBuySellAddEdit}},
        Mode=OneWay}"
    DisplayMemberPath="ItemName"/>

但是 Stephan Bauer 的答案仍然适用。

如果您希望新项目自动显示在列表中,请考虑 WaltiD 的答案。


1

这是不可能的,如果您愿意,可以使用internal代替。

...并使用ObservableCollection<T>,不要忘记设置视图的DataContext。


7
根据我的经验,即使是内部可访问性也足以破坏XAML数据绑定,只有公共属性才能被绑定。 - Neutrino

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