【问题标题】:How to bind an ItemsSource to a private property如何将 ItemsSource 绑定到私有属性
【发布时间】:2011-11-10 13:08:00
【问题描述】:

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

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

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

【问题讨论】:

  • 公共/内部使用绑定。

标签: c# wpf xaml data-binding


【解决方案1】:

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

MSDN:

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

【讨论】:

  • 使用 ObservableCollection 代替 List
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这是不可能的,如果您愿意,可以改用internal

    ...并使用ObservableCollection&lt;T&gt;,不要忘记设置视图的DataContext。

    【讨论】:

    • 根据我的经验,即使是内部可访问性也足以破坏 XAML 数据绑定,并且只能绑定公共属性。
    【解决方案4】:

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

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

    但斯蒂芬鲍尔的回答仍然适用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 2018-08-27
      • 2012-01-08
      • 2021-10-24
      • 2017-09-18
      相关资源
      最近更新 更多