好的,我不明白为什么WPF无法显示组合框项目的“显示成员”但可以执行“选定值”。奇怪的是我可以明确地创建显示成员但不能将其取回。在下面的示例中,我简化了将使用ADO.NET填充itemsource的真实示例,但概念是相同的。我正在生成一个在运行时从sql语句生成的组合框。我想获得一件事的价值,但显示其他东西。是否有一些我缺少的额外绑定或定制或只是.NET的错误成员?我只是希望得到“显示......”才能被选中。如果不可能那似乎有点奇怪。我选择的所有东西都是'价值'所以我知道转移中有些东西丢失了。
有什么想法吗?
XAML:
<Window x:Class="WPFComboBoxTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<ComboBox x:Name="cmb" Width="100" Height="50"/>
<TextBlock Height="100"/>
<Button x:Name="btn" Content="Click" Click="btn_Click" Width="50"/>
</StackPanel>
C#代码背后:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data;
namespace WPFComboBoxTest
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
BindComboBox(cmb);
}
public void BindComboBox(ComboBox cbx)
{
DataTable dt = new DataTable();
dt.Columns.Add("Value", typeof(string));
dt.Columns.Add("Id", typeof(int));
dt.Rows.Add("Display of One", 1);
dt.Rows.Add("Display of Two", 2);
dt.Rows.Add("Display of Three", 3);
dt.Rows.Add("Display of Four", 4);
cbx.ItemsSource = dt.DefaultView;
cbx.DisplayMemberPath = dt.Columns["Value"].ToString();
cbx.SelectedValuePath = dt.Columns["Id"].ToString();
}
private void btn_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Selected Value works: " + cmb.SelectedValue
+ "\n\nSelect Display does not though?: " + cmb.DisplayMemberPath
);
}
}
}
答案 0 :(得分:2)
在列上调用ToString
听起来不是一个好主意,不确定如何映射DataTables
但我会尝试
cbx.DisplayMemberPath = "Value";
cbx.SelectedValuePath = "Id";
答案 1 :(得分:1)
(facepalm)这很简单。 cmb.DisplayMemberPath需要是cmb.Text。 “文本”是显示向用户显示的显示成员所需的属性。
答案 2 :(得分:0)
将您的btn_Click
事件数据更改为以下内容:
private void btn_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Selected Value works: " + cmb.SelectedValue
+ "\n\nSelect Display does not though?: " + cmb.Text
);
}
我认为工作正常
答案 3 :(得分:0)
尝试使用:
cbx.DisplayMemberPath = "[Value]";
cbx.SelectedValuePath = "[Id]";
对我有用!