绑定了DisplayMember和ItemTemplate的组合框

本文关键字:组合 ItemTemplate DisplayMember 绑定 | 更新日期: 2023-09-27 18:17:19

我有ComboBox绑定到DataView与DisplayMemberPath绑定到一些字符串属性:

<ComboBox  DisplayMemberPath="{Binding SomeProperty}" ItemsSource="{Binding MyView}" />

我的虚拟机是这样的:

public class MyViewModel
{
    DataTable dt = new DataTable();
    public MyViewModel()
    {
        dt.Columns.Add("MyColumn");
        dt.Rows.Add("AAA");
        dt.Rows.Add("BBB");
    }
    public DataView MyView
    {
        get { return dt.DefaultView; }
    }
    public string SomeProperty
    {
        get { return "MyColumn"; }
    }
}

现在我想自定义ItemTemplate:

    <ComboBox.ItemTemplate>
        <DataTemplate >
            <StackPanel Orientation="Horizontal">
                <Rectangle Width="5" Height="5" Fill="Red" />
                <ContentControl Content="{Binding Path=???}" />
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>

由于DisplayMemberPath是动态的(我不能使用它与ItemTemplate),我如何指定路径?

编辑:

这是目前为止我的解决方案,但我认为它太复杂了:

<ContentControl.Content>
    <MultiBinding Converter="{StaticResource someMultiConverter}">
        <Binding Path="DataContext.SomeProperty" ElementName="comboBox1" />
        <Binding />
    </MultiBinding>
</ContentControl.Content>

和转换器:

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            //throw new NotImplementedException();
            string path = values[0] as string;
            DataRowView drv = values[1] as DataRowView;
            return drv[path].ToString();
        }

绑定了DisplayMember和ItemTemplate的组合框

所以你试图得到SomeProperty值到ContentControl.Content ?试试这个:

StackOverflow WPF Combobox DisplayMemberPath

你将不能设置相同的属性两次,这似乎是你正在做的。基本上,从:

中删除DisplayMemberPath
<ComboBox  DisplayMemberPath="{Binding SomeProperty}"....

And set

<ComboBox.ItemTemplate>
    <DataTemplate >
        <StackPanel Orientation="Horizontal">
            <Rectangle Width="5" Height="5" Fill="Red" />
            <TextBlock Text="{Binding Path=MyColumn}"/>
        </StackPanel>
    </DataTemplate>
</ComboBox.ItemTemplate>