1

さて、なぜ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
            );
    }
}
}
4

4 に答える 4

2

列を呼び出すToStringことは、最初は良い考えのようには思えません。どのようDataTablesにマッピングされているかはわかりませんが、試してみます

cbx.DisplayMemberPath = "Value";
cbx.SelectedValuePath = "Id";
于 2012-08-14T21:30:46.087 に答える
1

(facepalm) とてもシンプルでした。cmb.DisplayMemberPath は cmb.Text である必要があります。「テキスト」は、ユーザーに表示される表示メンバーを表示するために必要なプロパティでした。

于 2012-08-14T21:53:38.333 に答える
0

使用してみてください:

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

わたしにはできる!

于 2013-10-16T00:21:34.770 に答える