Ответ 1
вам не нужно указывать шаблон, вы можете просто использовать свойство DisplayMemberPath, например:
<ListBox ItemsSource="{Binding SomeCollection}" DisplayMemberPath="ThePropertyOnElm" />
надеюсь, что это поможет!
У меня есть список, в котором я привязываю ItemsSource к коллекции, хранящейся в установленном объекте DataContext. Это делает список отображаемым с помощью функции ToString().
<ListBox ItemsSource="{Binding SomeCollection}"></ListBox>
Теперь я хочу отобразить свойство для объектов в коллекции. Поэтому я хочу определить шаблон и т.д., Чтобы сделать это на всех объектах связанного списка. Я пробовал различные подходы без успеха. Я хотел бы сделать что-то вроде этого:
<ListBox ItemsSource="{Binding SomeCollection}">
<ListBox.Template>
<ControlTemplate>
<ListViewItem Content="{Binding ThePropertyOnElm}"></ListViewItem>
</ControlTemplate>
</ListBox.Template>
</ListBox>
Может ли кто-нибудь помочь мне сделать это правильно?
вам не нужно указывать шаблон, вы можете просто использовать свойство DisplayMemberPath, например:
<ListBox ItemsSource="{Binding SomeCollection}" DisplayMemberPath="ThePropertyOnElm" />
надеюсь, что это поможет!
Я думаю, что это то, что вы хотите сделать:
<ListBox ItemsSource="{Binding SomeCollection}">
<ListBox.ItemTemplate>
<DataTemplate DataType="{x:Type local:YourDataType}">
<TextBlock Text="{Binding ThePropertyOnElm}" />
</ControlTemplate>
</ListBox.ItemTemplate>
</ListBox>
Шаблон для ListBox будет изменять способ отображения фактического списка, а itemtemplate будет управлять тем, как будут выглядеть отдельные элементы в списке. Я изменил контрольную таблицу в DataTemplate и присвоил ее типу YourDataType. Кроме того, я использовал текстовый блок в шаблоне данных вместо listboxitem, так как datatemplate назначается в listboxitem (который должен содержать некоторый тип содержимого вместо другого listboxitem).
i havent попробовал скомпилировать это, чтобы он был не совсем корректным. если он не дает мне знать, и больно предпримет дополнительные шаги!
Использовать свойство привязки Path:
<ListBox ItemsSource="{Binding SomeCollection}">
<ListBox.Template>
<ControlTemplate>
<ListViewItem Content="{Binding Path=ThePropertyOnElm}"></ListViewItem>
</ControlTemplate>
</ListBox.Template>
</ListBox>
Примечание. Причиной несколько запутывающего имени (Path) является то, что его можно расширить до под-свойств и т.д. Поэтому, если свойство ThePropertyOnElm
возвращает объект с свойством Name
, вы можете написать {Binding Path=ThePropertyOnElm.Name}
и т.д.
Здесь образец, который я недавно опубликовал в Code Project:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2006"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"
x:Class="GameSampleApp.Window1"
x:Name="Window"
Title="Sample App"
Width="380" Height="240">
<Window.Resources>
<Style TargetType="ListBox">
<Setter Property="Control.FontFamily" Value="Tahoma" />
<Setter Property="Control.FontSize" Value="10" />
</Style>
<Style x:Key="FontStyle">
<Setter Property="Control.FontFamily" Value="Verdana" />
<Setter Property="Control.FontStyle" Value="Italic" />
<Setter Property="Control.FontSize" Value="12"/>
</Style>
<DataTemplate x:Key="GamePersonTemplate">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Width="40" Grid.Column="0" Text="{Binding Name, Mode=OneWay}" />
</Grid>
</DataTemplate>
</Window.Resources>
<Grid x:Name="LayoutRoot">
<ListBox Padding="3" HorizontalAlignment="Left" Width="Auto"
ItemTemplate="{DynamicResource GamePersonTemplate}"
ItemsSource="{Binding}" VerticalAlignment="Top" Height="Auto"/>
</Grid>
</Window>
В этом примере я устанавливаю ItemSource для указания привязки datacontext, которая может быть в любом месте над визуальным деревом. Шаблон элемента определяется в Window.Resources, но может быть также определен в отдельном ResourceDictionary. В принципе, этот шаблон элементов будет показывать один текстовый блок для каждой строки элементов, но при необходимости его можно будет значительно сложнее; что красота WPF.