我有一个列表框,我将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>
任何人都可以帮我做到这一点吗?
答案 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的魅力。