2011-09-05 60 views
8

如何將WPF ItemsSource綁定到私有屬性?如何將ItemsSource綁定到私有屬性

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

項目名單將同時加載窗體進行填充。

+0

公共/內部有約束力的作品。 – RainCast

回答

20

WPF中的DataBinding僅適用於公共屬性。

MSDN

屬性您使用的綁定源屬性的綁定必須 是你的類的公共屬性。明確定義的接口 屬性不能用於綁定的目的來訪問,也不能保護, 有沒有基礎 實現私有內部,或虛擬財產

+0

即使將其公開它沒有工作。 :( – sameera

+1

使用ObservableCollection 而不是列表

2

這是不可能的,如果你願意,你可以使用改爲internal

...並使用ObservableCollection<T>並且不要忘記設置視圖的DataContext。

+6

根據我的經驗,即使內部可訪問性足以打破XAML數據綁定,只有公有屬性可以綁定。 – Neutrino

1

您需要一個相對源綁定,現在您的綁定是您的ItemBuySellAddEdit(FrameworkElement)的DataContext,至少是我的印象,因爲您使用的是partial。如果它是一個ViewModel,請檢查輸出窗口,看看是否有任何綁定錯誤。

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

但是斯蒂芬鮑爾的答案仍然適用。

如果您希望自動顯示該列表中的新項目,請考慮WaltiD的答案。

3

如果你真的想這樣做,你必須提供一個自定義類型描述符,通過實現ICustomTypeDescriptor - 通過定製的PropertyDescriptor提供額外的屬性,沿着普通的公共屬性。您可以在類型本身上實現此接口,或通過TypeDescriptionProvider;後者是首選,因爲它可以在更多的場景下工作(像空列表這樣的事情,而不需要提供一個帶有ITypedList實現的自定義列表)。這是一個lot的工作,它真的是不值得的,除非在極端情況下。但這是可以完成的。

相關問題