WPF: установить Binding-свойство для ListBox-binding - PullRequest
12 голосов
/ 16 сентября 2009

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

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

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

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

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

Ответы [ 4 ]

32 голосов
/ 16 сентября 2009

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

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

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

11 голосов
/ 16 сентября 2009

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

<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, поскольку шаблон данных назначается элементу listbox (который должен содержать некоторый тип содержимого вместо другого элемента listbox).

Я не пытался скомпилировать это, так что это может быть не совсем правильно. если он не даст мне знать и я предприму дополнительные шаги!

2 голосов
/ 16 сентября 2009

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

1 голос
/ 16 сентября 2009

Вот пример, который я недавно разместил в 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>

В этом примере я установил ItemsSource, чтобы он указывал на привязку datacontext, которая может находиться в любом месте визуального дерева. Шаблон элемента определяется в Window.Resources, но также может быть определен в отдельном ResourceDictionary. По сути, этот шаблон элементов будет показывать по одному текстовому блоку для каждой строки элемента, но в случае необходимости его можно сделать намного более сложным; в этом прелесть WPF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...