2011-09-05 2 views
8

Jak powiązać WPF i ItemsSource z własnością prywatną?Jak powiązać ItemsSource z prywatną własnością?

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

lista przedmioty zostaną wypełnione podczas obciążeń formularza.

+0

prace publiczne/wewnętrzne z wiązaniem. – RainCast

Odpowiedz

20

DataBinding w WPF działa tylko z właściwościami publicznymi.

MSDN:

Właściwości użyć właściwości jako wiążące źródła dla wiązania muszą być właściwości publiczne klasy. Wyraźnie zdefiniowane interfejs właściwości nie mogą być dostępne dla celów wiążące, ani nie można chronić, właściwości prywatne, wewnętrzne lub wirtualnych, które nie mają podstawy realizację

+0

nawet jeśli sprawiłoby, że publicznie to nie działało. :( – sameera

+1

Użyj ObservableCollection zamiast listy

2

To nie jest możliwe, jeśli chcesz, można użyć internal zamiast tego.

... i użyj ObservableCollection<T> i nie zapomnij ustawić DataContext widoku.

+6

Z mojego doświadczenia wynika, że ​​nawet wewnętrzna dostępność jest wystarczająca do zerwania powiązania danych XAML i tylko publiczne właściwości mogą być powiązane. – Neutrino

1

Potrzebujesz wiązania Względne źródło, teraz twoje powiązanie jest z DataContext twojego ItemBuySellAddEdit (FrameworkElement) Atleast, który jest moim Impressionem, ponieważ używasz partial. Jeśli jest to ViewModel, sprawdź okno Output i sprawdź, czy masz błędy wiązania.

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

Ale odpowiedź Stephan Bauer nadal obowiązuje.

Weź również pod uwagę odpowiedź WaltiD, jeśli chcesz, aby nowe pozycje na tej liście pojawiały się automatycznie.

3

Jeśli naprawdę chcesz to zrobić, musisz podać niestandardowy deskryptor typu, implementując ICustomTypeDescriptor - który zapewnia dodatkową właściwość poprzez niestandardowe PropertyDescriptor wzdłuż zwykłych właściwości publicznych. Możesz zaimplementować ten interfejs na samym typie lub poprzez TypeDescriptionProvider; ten drugi jest preferowany, ponieważ działa w większej liczbie scenariuszy (takich jak puste listy, bez potrzeby dostarczania niestandardowej listy z implementacją ITypedList). Jest to praca część i nie jest warta tego, z wyjątkiem ekstremalnych przypadków. Ale można to zrobić.