如何将ItemsSource绑定到私有属性

时间:2011-09-05 10:59:54

标签: c# wpf xaml data-binding

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

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

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

4 个答案:

答案 0 :(得分:20)

WPF中的DataBinding仅适用于公共属性。

MSDN

  

您用作绑定的绑定源属性的属性必须   是你班级的公共财产。明确定义的接口   无法访问属性用于绑定目的,也不能保护,   没有基础的私有,内部或虚拟属性   实施

答案 1 :(得分:3)

如果你真的想要这样做,你必须提供一个自定义类型描述符,通过实现ICustomTypeDescriptor - 通过常规公共属性的自定义PropertyDescriptor提供额外的属性。您可以在类型本身上实现此接口,也可以通过TypeDescriptionProvider实现;后者是首选,因为它适用于更多场景(诸如空列表之类的东西,而不需要提供具有ITypedList实现的自定义列表)。这是很多的工作,除非在极端情况下,真的是不值得的。但它可以做到。

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

你需要一个相对源绑定,现在你的绑定是你的{Impor的ItemBuySellAddEdit(FrameworkElement)Atleast的DataContext,因为你正在使用partial。如果是ViewModel,请检查输出窗口,看看是否有任何绑定错误。

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

但Stephan Bauer的答案仍然适用。

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