我有一个组合框,它是从一个名称列表中填充的,这些名称是从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();
答案 0 :(得分:1)
ComboBox
包含DisplayMemberPath
和SelectedValuePath
的属性,因此您可以使用它来告诉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.