WPF:为ListBox绑定设置Binding-property

时间:2009-09-16 12:13:03

标签: .net wpf binding listbox

我有一个列表框,我将ItemsSource绑定到存储在set DataContext对象中的集合。这使得使用ToString()函数显示列表。

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

现在我想显示集合中对象的属性。所以我想定义一个模板等来对绑定列表中的所有对象执行此操作。我尝试了各种不同的方法而没有成功。我想做这样的事情:

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

任何人都可以帮我做到这一点吗?

4 个答案:

答案 0 :(得分:32)

您不需要指定模板,您可以使用DisplayMemberPath属性,如下所示:

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

希望这有帮助!

答案 1 :(得分:11)

我认为这就是你想要做的事情:

<ListBox ItemsSource="{Binding SomeCollection}">
    <ListBox.ItemTemplate>
        <DataTemplate DataType="{x:Type local:YourDataType}">                                
            <TextBlock Text="{Binding ThePropertyOnElm}" />
        </ControlTemplate>
    </ListBox.ItemTemplate>
</ListBox>

ListBox的模板将修改实际列表框的外观,而itemtemplate将控制列表框中各个项目的外观。我将controltemplate更改为DataTemplate并将其分配给YourDataType类型。此外,我在数据模板中使用了一个文本块而不是listboxitem,因为datatemplate被分配给listboxitem(它应该包含某种类型的内容而不是另一个listboxitem)。

我没有尝试过编译,所以它可能不完全正确。如果它不让我知道,并采取额外的步骤生病了!

答案 2 :(得分:2)

使用路径绑定属性:

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

注意:名称(Path)有点令人困惑的原因是它可以扩展到子属性等。因此,如果ThePropertyOnElm属性返回一个名为Name的属性的对象,那么可以写{Binding Path=ThePropertyOnElm.Name}等。

答案 3 :(得分:1)

以下是我最近在代码项目中发布的示例:

    <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的魅力。