多个ComboBox.DisplayMemberPath选项?

时间:2014-08-17 06:12:15

标签: c# wpf data-binding combobox

我将一组对象绑定到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";

4 个答案:

答案 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;
    }