Получение выбранного значения ComboBox в DataGrid - PullRequest
0 голосов
/ 29 марта 2011

Как я могу получить выбранное значение поля со списком, который находится в сетке данных?

Я упростил мою проблему, чтобы кому-то было легче помочь.Вот XAML:

<Window x:Class="del_WpfApplication3.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">
    <Grid>
        <DataGrid DataContext="{Binding}" AutoGenerateColumns="False" Height="200" HorizontalAlignment="Left" Margin="60,32,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="368">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding test}"></DataGridTextColumn>
                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding combo}" DisplayMemberPath="value" SelectedValuePath="key" SelectedItem="{Binding selected, Mode=TwoWay}"></ComboBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="353,238,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    </Grid>
</Window>

Вот код:

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;

namespace del_WpfApplication3
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            load();
        }

        public class tmp1
        {
            public string test { get; set; }
            public IList<tmp2> combo { get; set; }
            public string selected { get; set; }
        }

        public class tmp2
        {
            public string key { get; set; }
            public string value { get; set; }
            public string selected { get; set; }
        }

        private void load()
        {
            IList<tmp2> list = new List<tmp2>();
            list.Add(new tmp2(){ key = "key1", value = "value1" });
            list.Add(new tmp2(){ key = "key2", value = "value2" });

            IList<tmp1> list2 = new List<tmp1>();
            list2.Add(new tmp1() { test = "test1", combo = list });
            list2.Add(new tmp1() { test = "test2", combo = list });

            dataGrid1.ItemsSource = list2;


        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            tmp1 t = (tmp1)dataGrid1.Items[0];
            Console.WriteLine(t.selected); // this is empty when I'm expecting it to be the selected value as set in the XAML.
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 29 марта 2011

Если в свойстве "content" не существует каких-то странных вложенных свойств, к которым привязан ItemsSource, я предполагаю, что ComboBox даже не отображает данные.

Значение Combobox должно быть определено как:

<ComboBox 
  ItemsSource="{Binding content}" 
  DisplayMemberPath="ContentName" 
  SelectedValuePath="ContentID" 
  Name="ContentSelector" />

, где ContentName и ContentID - это свойства content, который определяется как ItemsSource.

0 голосов
/ 29 марта 2011

Вот пример, где я использую Telerik Control, но это не имеет значения.

 <telerik:RadComboBox Margin="5" 
        Height="28" Width="220" 
        VerticalAlignment="Top" HorizontalAlignment="Left"
        ItemsSource="{Binding Path=ProductTypeList}"
        SelectedItem="{Binding Path=SelectedProductType, Mode=TwoWay}"
        DisplayMemberPath="Code">
  </telerik:RadComboBox>

Обратите внимание, что я просто установил для выбранного элемента привязку к объекту этого типа ... Итак, это означает, что у меня есть доступ ко всему этому объекту, и я могу где угодновыберите вид и посмотрите, где находится этот список и т. д. Весь смысл в том, чтобы вместо привязки отслеживать одно свойство коллекции объектов, вы отслеживаете весь объект в этой коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...