2015-09-24 3 views
0

У меня есть много выпадающие списки с различными DisplayMemberPathesComboBox Связывание TextBlock Text дорожить DisplayMemberPath

мне нужно создать один стиль с TextWrapping

app.xaml:

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

ComboBoxes:

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

Так, я знаю, что я могу создать свойство Value в каждом классе ComboBoxItem и использовать его

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

Но может быть есть другой способ без создания специального имущества?

+0

К чему вы клоните? Коллекция строк? –

+0

различные элементы, это может быть коллекция строк, коллекция keyvalyepair, коллекция классов и т. Д. – Kira

ответ

0

Если привязка к типу значения, такие как string или int, вы можете просто использовать {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 отображаться как все, что находится внутри Name собственности в вашем ComboBox.


Принимая это шаг вперед, ваши требования, что вам может понадобиться поместить объекты разных типов в одном ComboBox. Не проблема, вы можете использовать DataType собственности в DataTemplate, смотрите ниже:

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

Обратите внимание, что они должны быть объявлены в ResourceDictionary, и будет влиять на все объекты, отображаемые этого типа. Это позволяет определить, что отображается для данного типа.

+0

спасибо за переопределение строки ToString(), и мне не нужно ставить объекты разных типов в один ComboBox =), но спасибо за это тоже может быть когда-то это помогает – Kira

+0

Не проблема :-) –

+0

но ... как насчет словаря как источника? Словарь например – Kira

0

Действительно, вы не можете одновременно установить и свойство DisplayMemberPath, и определенное ItemTemplate. Они взаимоисключающие.

Вы можете прочитать его here

Это свойство [т.е.DisplayMemberPath] простой способ определить шаблон по умолчанию, который описывает, как отображать объекты данных

Так что, если вам нужен конкретный шаблон элемента, просто не установить DisplayMemberPath свойства вашего комбобокса (нет необходимости сделай это).

+0

Я знаю это, поэтому я спросил, как создать ItemTemplate для работы с другим DisplayMemberPath, а иначе, иначе DisplayMemberPath – Kira

+0

В этом случае я думаю, что лучшим решением является тот, который предложил @MikeEason. Кроме того, вы можете использовать [ItemTemplateSelector] (https://msdn.microsoft.com/it-it/library/system.windows.controls.itemscontrol.itemtemplateselector (v = vs.110) .aspx) тоже. –

Смежные вопросы