我将一组对象绑定到ComboBox
。我想要实现的是一个组合框,它显示了我对象的两个属性。但是,我还没有想出如何组合多个DisplayMemberPaths
组合框。这可能吗?
这就是我目前设置Binding并设置DisplayMemberPath
的方式:
Binding comboBinding = new Binding();
comboBinding.Source = squad_members; //squad_members is the object collection
BindingOperations.SetBinding(Character_ComboBox, ComboBox.ItemsSourceProperty, comboBinding);
Character_ComboBox.DisplayMemberPath = "Name"; //
//Character_ComboBox.DisplayMemberPath = "Name" + "Age"; //failed attempt
Character_ComboBox.SelectedValuePath = "Name";
答案 0 :(得分:11)
首先,你应该在XAML中进行绑定而不是代码。
您可以提供 ItemTemplate
并在 StringFormat
中使用 MultiBinding
,如下所示:
<ComboBox ItemsSource="{Binding YourCollection}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} - {1}">
<Binding Path="Name"/>
<Binding Path="Age"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
如果您想在后面的代码中进行绑定。
您可以 通过覆盖基础源类中的ToString() 方法来完全忽略设置DisplayMemberPath。因为,如果没有提供DisplayMemberPath,则会调用内部ToString()。
假设您的集合属于List<Person>
类型,因此您可以在Person类上覆盖ToString():
public override string ToString()
{
return Name + Age;
}
有了这个,绑定将如下所示(不需要DisplayMemberPath)
Binding comboBinding = new Binding();
comboBinding.Source = squad_members; //squad_members is the object collection
BindingOperations.SetBinding(Character_ComboBox,
ComboBox.ItemsSourceProperty, comboBinding);
答案 1 :(得分:3)
使用ComboBox的ItemTemplate,使用多个TextBlock,您需要多个列。像这样的东西,
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Width="50" Text="{Binding Path=Name}" />
<TextBlock Width="50" Text="{Binding Path=Age}" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
答案 2 :(得分:1)
除了另一个答案之外,您可以拥有一个可以返回您想要的属性,或者更好的是一个可以为您完成工作的转换器。
螺旋桨:
public int First {get; set;}
public int Second {get; set;}
public int BindToThis {get{return First+Second;}}
转换器:参见示例In this MSDN page。
主要是沿着这条线:
<TextBlock Name="textBox2" DataContext="{StaticResource NameListData}">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource myNameConverter}"
ConverterParameter="FormatLastFirst">
<Binding Path="FirstName"/>
<Binding Path="LastName"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
和
public class NameConverter : IMultiValueConverter
{
public object Convert( object[] values
, Type targetType
, object parameter
, CultureInfo culture )
{
string name;
switch ((string)parameter)
{
case "FormatLastFirst":
name = values[1] + ", " + values[0];
break;
case "FormatNormal":
default:
name = values[0] + " " + values[1];
break;
}
return name;
}
// public object[] ConvertBack...
}
答案 3 :(得分:0)
或者您只是覆盖类中的ToString方法,例如
public override string ToString()
{
return Name + " " + Age;
}