I have a class Binding
with List<KeyValuePair<BoardElement,int>>
:
public class Binding
{
public List<KeyValuePair<BoardElement, int>> Outputs { get; set; }
}
And class BoardElement
contains property Name
:
public class BoardElement
{
private string Name { get; set; }
}
And I have ObservableCollection<Binding>
.
Now, I want Binding
Name
<- BoardElement
<- KeyValuePair
<- Outputs
.
I try somthing like this
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Outputs.Key.Name}" SelectedIndex="{Binding SelectedType}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
But it doesn't work, because it needs something in the path here Binding Outputs.?.Key.Name
.
It works only if I choose first element Binding Outputs[0].Key.Name
, but I want to create a TextBlock
for each KeyValuePair
and bring a Name
to them.
public ObservableCollection<Binding> B { get; set; }
public MainWindow()
{
var a = new Binding();
a.Input = new BoardElement("D1");
a.Outputs = new List<KeyValuePair<BoardElement, int>>();
var c = new BoardElement("D2");
a.Outputs.Add(new KeyValuePair<BoardElement, int>(c, 7));
B = new ObservableCollection<Binding>();
B.Add(a);
ListOfBindngs.ItemsSource = B;
}
So I want to know how Binding
colletions in another collection?
I can only choose by index ([0], [1], et cetera...) but I want to show them all
CodePudding user response:
You have a nested list: list of Binding
and each of them have a list of KeyValuePair
.
Option A, Nested ListBox:
<ListBox SelectedIndex="{Binding SelectedType}" x:Name="ListOfBindngs" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<ListBox ItemsSource="{Binding outputs}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Key.Name}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Option B, Converter:
public class ConvertOutputs : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var list = (List<KeyValuePair<BoardElement, int>>)value;
return string.Join(", ", list.Select(x => x.Key.Name));
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => null;
}
And in xaml:
<ListBox SelectedIndex="{Binding SelectedType}" x:Name="ListOfBindngs" >
<ListBox.Resources>
<local:ConvertOutputs x:Key="ConvertOutputs"/>
</ListBox.Resources>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding outputs, Converter={StaticResource ConvertOutputs}}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>