我有一個組合框,並希望將其ItemsSource綁定到IEnumerable<(string,string)>
。如果我沒有設置DisplayMemberPath,那麼它將起作用,並在下拉區域顯示在項目中調用ToString()
的結果。不過,當我設置DisplayMemberPath="Item1"
它不再顯示任何東西。我做了以下示例,其中您可能會看到如果使用經典Tuple
類型,則按預期工作。ValueTuple不支持DisplayMemberPath。組合框,WPF
在調試時,我已經檢查到valuetuple的Item1和Item2也是屬性。
我的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>
而且我隱藏:
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();
}
}
}
在運行這個樣本將正確顯示數據在第一組合框,但會什麼都不顯示在第二位。
爲什麼會發生這種情況?
這個故事告訴我們,一個'ValueTuple'的項目被暴露領域,而不是性能,和WPF做不支持綁定到字段。 –