/ / Powiązanie wewnątrz elementuSource zdefiniowanego w XAML - c #, wpf, xaml

Powiązanie wewnątrz źródła ItemsSource zdefiniowanego w XAML - c #, wpf, xaml

Chcę zdefiniować ItemsSource z ItemsControl w XAML i w tych pozycjach użyj powiązania danych z DataContext z mojego punktu widzenia, ale nie mogę go uruchomić.

Oto jak wyglądałaby uproszczona wersja:

<ComboBox DisplayMemberPath="Label" DataContext="Item 3">
<ComboBox.ItemsSource>
<x:Array Type="{x:Type local:Item}">
<local:Item Label="Item 1" />
<local:Item Label="{Binding}" />
</x:Array>
</ComboBox.ItemsSource>
</ComboBox>

z Item zdefiniowane w ten sposób:

public class Item : DependencyObject
{
public static readonly DependencyProperty LabelProperty =
DependencyProperty.Register(nameof(Label), typeof(string), typeof(Item));

public string Label
{
get { return (string)GetValue(LabelProperty); }
set { SetValue(LabelProperty, value); }
}
}

Spodziewam się zobaczyć dwa elementy w ComboBox z „Przedmiotem 1” i „Przedmiotem 2” jako tekstem, ale drugi element ma pusty tekst. Dlaczego?

Odpowiedzi:

0 dla odpowiedzi № 1

Chcesz zastąpić ItemTemplate dla ComboBox, Przykład jest pokazany poniżej:

<ComboBox x:Name="ExampleComboBox"
Height="24"
Width="200"
HorizontalContentAlignment="Stretch">
<ComboBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="10" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="10" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>

<TextBlock Grid.Column="0"
Text="{Binding FirstName}" />
<TextBlock Grid.Column="2"
Text="{Binding LastName}" />
<TextBlock Grid.Column="4"
HorizontalAlignment="Right"
Text="{Binding Country}" />
</Grid>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>

Przykładowe dane wyjściowe pokazano poniżej:

wprowadź opis obrazu tutaj


0 dla odpowiedzi nr 2

W końcu znalazłem wyjaśnienie! The ItemsSource nie ma w drzewie wizualnym, dlatego wiązanie nie działa. Znalazłem tutaj świetne wyjaśnienie i obejście: https://stackoverflow.com/a/7661689, które doprowadziły mnie do innego (podobnego) obejścia tutaj: http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/.

Korzystając z tego drugiego, mój kod wygląda teraz tak (w tym nieco zbyt uproszczonym i raczej głupim przykładzie):

<ComboBox DisplayMemberPath="Label" DataContext="Item 3">
<ComboBox.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}" />
</ComboBox.Resources>
<ComboBox.ItemsSource>
<x:Array Type="{x:Type local:Item}">
<local:Item Label="Item 1" />
<local:Item Label="{Binding Data, Source={StaticResource proxy}}" />
</x:Array>
</ComboBox.ItemsSource>
</ComboBox>

I działa.