WPF: установить свойство привязки для привязки ListBox

У меня есть список, в котором я привязываю ItemsSource к коллекции, хранящейся в установленном объекте DataContext. Это делает список отображаемым с помощью функции ToString().

<ListBox ItemsSource="{Binding SomeCollection}"></ListBox>                    

Теперь я хочу отобразить свойство для объектов в коллекции. Поэтому я хочу определить шаблон и т.д., Чтобы сделать это на всех объектах связанного списка. Я пробовал различные подходы без успеха. Я хотел бы сделать что-то вроде этого:

<ListBox ItemsSource="{Binding SomeCollection}">
    <ListBox.Template>
        <ControlTemplate>                                
            <ListViewItem Content="{Binding ThePropertyOnElm}"></ListViewItem>
        </ControlTemplate>
    </ListBox.Template>
</ListBox>

Может ли кто-нибудь помочь мне сделать это правильно?

Ответ 1

вам не нужно указывать шаблон, вы можете просто использовать свойство DisplayMemberPath, например:

<ListBox ItemsSource="{Binding SomeCollection}" DisplayMemberPath="ThePropertyOnElm" />

надеюсь, что это поможет!

Ответ 2

Я думаю, что это то, что вы хотите сделать:

<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 попробовал скомпилировать это, чтобы он был не совсем корректным. если он не дает мне знать, и больно предпримет дополнительные шаги!

Ответ 3

Использовать свойство привязки 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} и т.д.

Ответ 4

Здесь образец, который я недавно опубликовал в 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.