Datagrid ComboBox绑定两个值

时间:2014-05-28 19:06:16

标签: c# wpf datagrid combobox

我有一个组合框,它是从一个名称列表中填充的,这些名称是从Observable集合中选择的。但是,与这些名称相关联的是该Observable集合中的ID。目标是当用户选择一个新名称时(Say将“John”更改为“Jill”)我将能够获得ID,而不仅仅是名称。我能想到的唯一方法就是将ID也以某种方式存储在组合框中。但我不知道怎么做绑定。

<DataGridTemplateColumn Header="Name ">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox  x:Name="namescombo" ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Names}" 
                          SelectedItem="{Binding Name,  UpdateSourceTrigger=PropertyChanged}" FontSize="12" Background="White" FontFamily="Cambria" BorderBrush="White" BorderThickness="0"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

C#

ObservableCollection<Name> Names = new ObservableCollection<Name>();       
Name twofields = new Name();
        var NamesQuery =
           from p in dataEntities.Names

           select new { p.Name, p.Id };

        foreach (var p in NamesQuery)
        {


            Names.Add(new Name
                {
            ID = p.Id,
            Name = p.Name

                });

        }
 Names = Names.Select(p => p.Name).Distinct().ToList();

2 个答案:

答案 0 :(得分:1)

ComboBox包含DisplayMemberPathSelectedValuePath的属性,因此您可以使用它来告诉ComboBox"Id"标识项目property,但向用户显示"Name"属性。

例如,

<DataGridTemplateColumn Header="Name ">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox 
                ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Names}" 
                DisplayMemberPath="Name"
                SelectedValuePath="Id"
                SelectedValue="{Binding SelectedId}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

我建议使用SelectedValue而不是SelectedItem,因为WPF将SelectedItem.Equals()进行比较,默认情况下是按引用比较项目,如果SelectedItem不是与ItemsSource中的项目完全相同的引用,它不会被选中。

例如,SelectedItem = new Person(1, "Test");可能无法正确设置所选项目,SelectedItem = ItemsSource[0]因为它引用了ItemsSource中存在的项目。

此外,仅将所选项目的Id存储在一行而不是整个对象上更有意义:)

答案 1 :(得分:0)

您可以直接绑定到Name对象集合,并将 DisplayMemberPath 设置为 Name 属性,以便字符串为在GUI上显示,但实际上你有完整的对象绑定到comboBox。

这样您就可以将 SelectedItem 绑定到Name对象,并可以访问Id和Name属性。

<ComboBox ItemsSource="{Binding Names}" // Collection of name objects.
          DisplayMemberPath="Name"
          SelectedItem="{Binding SelectedNameObject}"/> // Object of type Name.