ComboBox将TextBlock文本绑定到DisplayMemberPath的值

时间:2015-09-24 07:25:19

标签: c# wpf xaml combobox

我有很多组合框,有不同的 DisplayMemberPathes

我需要使用TextWrapping

创建一种样式

的App.xaml:

<Setter Property="ItemTemplate" >  
            <Setter.Value>
                 <DataTemplate >
                <TextBlock Text="{Binding *what here?*}" TextWrapping="Wrap"/>
                </DataTemplate>
         </Setter.Value>
     </Setter>

组合框:

<ComboBox DisplayMemberPath="val1" />
<ComboBox DisplayMemberPath="val2" />
<ComboBox DisplayMemberPath="val3" />

所以,我知道,我可以在每个ComboBoxItem类中创建属性Value并使用它

 <TextBlock Text="{Binding Value }" TextWrapping="Wrap"/>

但是如果没有创造特殊财产,可能会有另一种方式吗?

2 个答案:

答案 0 :(得分:0)

如果您绑定到值类型,例如stringint,则可以使用{Binding},这是一个示例:

<DataTemplate >
    <TextBlock Text="{Binding}" TextWrapping="Wrap"/>
</DataTemplate>

这种绑定将绑定到对象本身,而不是绑定到所述对象上的属性

注意Text中显示的内容将是该对象上.ToString()方法返回的内容。

然后,您可以覆盖类中的.ToString()方法以返回有用的内容,如下所示:

public class MyClass
{
    public string Name { get; set; }

    public override string ToString()
    {
        return Name;
    }
}

这会强制MyClass显示为NameComboBox属性中的任何内容。

更进一步,您的要求是您可能需要将不同类型的对象放在一个ComboBox中。没问题,您可以使用DataType中的DataTemplate属性,请参阅下文:

<DataTemplate DataType="{x:Type myNamespace:myClass}">
    ...
</DataTemplate>

请注意,这些内容应在ResourceDictionary中声明,并会影响显示该类型的所有对象。这允许您定义为给定类型显示的内容。

答案 1 :(得分:0)

实际上,您无法同时设置DisplayMemberPath属性和特定的ItemTemplate。它们是相互排斥的。

您可以阅读here

  

此属性[即DisplayMemberPath]是一种定义描述如何显示数据对象的默认模板的简单方法

因此,如果您需要特定的项目模板,只需不要设置组合框的DisplayMemberPath属性(不需要这样做)。