2012-08-14 68 views
1

好吧我不明白爲什麼WPF無法顯示組合框項目的「顯示成員」,但可以執行「選定值」。奇怪的是,我可以明確地創建顯示成員,但不能恢復。在我的示例中,我簡化了將使用ADO.NET來填充項目源的真實世界示例,但概念是相同的。我正在生成一個在運行時從sql語句生成的組合框。我想獲得一件事物的價值,但要顯示別的東西。是否有一些額外的綁定或定製我缺少或只是錯誤的成員的.NET?我只想讓'顯示...'選擇回來。如果這似乎不可能有點奇怪。當我選擇'價值'時,所有我回來,所以我知道在轉移中丟失了一些東西。Combobox不能正確顯示「顯示成員」?

任何想法?

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

(facepalm)它非常簡單。 cmb.DisplayMemberPath需要是cmb.Text。 「文本」是我需要顯示向用戶顯示的顯示成員的屬性。 – djangojazz 2012-08-14 21:53:00

回答

1

(facepalm)它非常簡單。 cmb.DisplayMemberPath需要是cmb.Text。 「文本」是我需要顯示向用戶顯示的顯示成員的屬性。

2

在列調用ToString聽起來並不像一個好主意,開始,不知道如何DataTables映射但我會嘗試

cbx.DisplayMemberPath = "Value"; 
cbx.SelectedValuePath = "Id"; 
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 
    ); 
} 

我覺得做工精細

0

嘗試使用:

cbx.DisplayMemberPath = "[Value]"; 
cbx.SelectedValuePath = "[Id]"; 

這對我的作品!