I have a combobox and want to bind its ItemsSource to an IEnumerable<(string,string)>
. If I do not set DisplayMemberPath, then it works and it shows in the dropdown area the result of calling ToString()
in the items. Nevertheless when I set DisplayMemberPath="Item1"
it does not show anything anymore. I have made the following sample in which you may see that if I use classic Tuple
type it works as expected.
When debugging I have checked that the valuetuple has Item1 and Item2 as properties also.
My XAML:
<Window x:Class="TupleBindingTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Loaded="MainWindow_OnLoaded"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<ComboBox x:Name="TupleCombo" Grid.Row="0" VerticalAlignment="Center"
DisplayMemberPath="Item1" />
<ComboBox x:Name="ValueTupleCombo" Grid.Row="1" VerticalAlignment="Center"
DisplayMemberPath="Item1" />
</Grid>
</Window>
And my codebehind:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
namespace TupleBindingTest
{
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
}
private IEnumerable<Tuple<string, string>> GetTupleData()
{
yield return Tuple.Create("displayItem1", "valueItem1");
yield return Tuple.Create("displayItem2", "valueItem2");
yield return Tuple.Create("displayItem3", "valueItem3");
}
private IEnumerable<(string, string)> GetValueTupleData()
{
yield return ( "displayItem1", "valueItem1");
yield return ("displayItem2", "valueItem2");
yield return ("displayItem3", "valueItem3");
}
private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
{
TupleCombo.ItemsSource = GetTupleData();
ValueTupleCombo.ItemsSource = GetValueTupleData();
}
}
}
At runtime this sample will show the data properly in the first combobox but will show nothing in the second.
Why does this happen?