.net WPF:为ListBox绑定设置绑定属性

.net WPF:为ListBox绑定设置绑定属性,.net,wpf,binding,listbox,.net,Wpf,Binding,Listbox,我有一个列表框,将ItemsSource绑定到set-DataContext对象中存储的集合。这将使用ToString()函数显示列表 <ListBox ItemsSource="{Binding SomeCollection}"></ListBox> 现在我想显示集合中对象的属性。因此,我想定义一个模板等来对绑定列表中的所有对象执行此操作。我尝试了各种不同的方法,但没有成功。我想这样做: <ListBox ItemsS

我有一个列表框,将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>


谁能帮我把这件事做好吗

使用路径绑定属性:

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


注意:名称(路径)有些混乱的原因是它可以扩展到子属性等。因此,如果
ThePropertyOnElm
属性返回一个名为
name
的属性的对象,您可以编写
{Binding Path=ThePropertyOnElm.name}

    <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中定义。基本上,这个items模板将为每个item行显示一个textblock,但是如果必要的话,它可以变得更加复杂;这就是WPF的优点。

您不需要指定模板,只需使用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的模板将修改实际ListBox的外观,itemtemplate将控制ListBox中各个项目的外观。我将controltemplate更改为DataTemplate,并将其分配给YourDataType的类型。此外,我在数据模板中使用了textblock而不是listboxitem,因为datatemplate被分配给listboxitem(它应该包含某种类型的内容,而不是另一种listboxitem)


我还没有尝试编译这个,所以它可能不完全正确。如果它不让我知道,我会采取额外的步骤

你是说
propertyonelm
是一个运行时值,可以动态更改以更改列表框中显示的项目吗?如果我不准确,我很抱歉。我的意思是SomeCollection是一个ObservableCollection,MyElm有一个属性ThePropertyOnElm,我希望它显示在列表框中,而不是MyElm的ToString()函数返回的任何内容。不,这没有帮助。无论如何我认为路径在像这样的简单绑定上是可选的,其中您只指定了路径。因此,你的例子和我的一样。没有?或者我认为这与问题中的问题没有任何不同。
Binding
Path
属性是默认的内容属性,这意味着您不必按照建议显式地包含它。我不认为最初的问题很清楚需要什么。Roel说到点子上了,但是如果你最终需要使它变得更复杂,比如在模板中显示多个属性,那么就使用它。这看起来像是我想要的-直到Roel给出了更简单的一个,是的。如果我需要做更复杂的事情,请保留此文件以供以后参考。谢谢!