使用ItemsPanelTemplate时的DisplayMemberPath

时间:2015-08-28 10:12:25

标签: wpf listbox itemspaneltemplate

我有一个SomeObject类型的对象列表,定义如下:

public struct SomeObject
{
  public SomeObject(int id, string imgPath)
  {
    Id = id;
    ImagePath = imgPath;
  }

  public int Id;
  public string ImagePath;
}

我想在列表框中显示这些对象,列表框显示每个对象的一个​​图像并将其排列在图块布局中。 ItemsTemplate只是一个图像。 ItemsPanelTemplate是一个TilePanel。

当我只使用字符串(图像路径)作为列表项而不是SombeObject项时,一切正常并且图像显示正确。

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled"
         SelectionMode="Extended"
         SelectionChanged="OnItemSelectionChanged"
         ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type controls:VerticalTileBox}},
                    Path=SomeObjectsCollectionView, UpdateSourceTrigger=PropertyChanged}"
         >
  <ListBox.ItemTemplate>
  <DataTemplate>
      <Image Source ="{Binding}" 
                 VerticalAlignment="Center" HorizontalAlignment="Center" Stretch="Uniform" >            
      </Image>
   </DataTemplate>
  </ListBox.ItemTemplate>
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <controls:VirtualizingTilePanel ChildSize="{Binding 
        RelativeSource={RelativeSource AncestorType={x:Type controls:VerticalTileBox}},
                    Path=ItemSize, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" />
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
  <ListBox.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
      <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
      <Setter Property="VerticalContentAlignment" Value="Stretch"/>
      <Setter Property="Padding" Value="0"/>
    </Style>
  </ListBox.ItemContainerStyle>
</ListBox>

使用SomeObject项时,此代码会为我提供一个图块列表,但不会显示图像。

System.Windows.Data错误:40:BindingExpression路径错误:&#39; ImagePath&#39;在&#39; object&#39;上找不到的属性&#39;&#39; SomeObject&#39; (的HashCode = 1739718653)&#39 ;. BindingExpression:路径=的ImagePath;的DataItem =&#39; SomeObject&#39; (的HashCode = 1739718653); 目标元素是&#39; Image&#39; (名称=&#39;&#39);目标财产是来源&#39; (键入&#39; ImageSource&#39;)

这是预期的,因为我没有告诉控件,究竟要显示什么(SomeObject的哪个属性)。 除了ItemsPanelTemplate之外,使用DisplayMemberPath不起作用,那么如何设置用于在图像中显示的属性?

感谢您的帮助!

编辑: @ nkoniishvt

这听起来确实是正确的做法,但我无法让它正常工作。我做错了什么?

我将此DP添加到后面的UserControl代码中:

public static readonly DependencyProperty ItemsTemplateProperty =
  DependencyProperty.Register("ItemsTemplate", 
  typeof(DataTemplate),
  typeof(VerticalTileBox),
  new PropertyMetadata(null));

public DataTemplate ItemsTemplate
{
  get {return (DataTemplate)GetValue(ItemsTemplateProperty);}
  set {SetValue(ItemsTemplateProperty, value);}
}

并像这样更改了xaml:

<ListBox 
         ScrollViewer.HorizontalScrollBarVisibility="Disabled"
         SelectionMode="Extended"
         SelectionChanged="OnItemSelectionChanged"
         ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type controls:VerticalTileBox}},
                    Path=ItemCollection, UpdateSourceTrigger=PropertyChanged}"
       ItemTemplate="{Binding RelativeSource={RelativeSource AncestorType={x:Type controls:VerticalTileBox}},
                    Path=ItemsTemplate, UpdateSourceTrigger=PropertyChanged}"
       >
   <ItemsPanelTemplate>
      <controls:VirtualizingTilePanel ChildSize="{Binding 
        RelativeSource={RelativeSource AncestorType={x:Type controls:VerticalTileBox}},
                    Path=ItemSize, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" />
  </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
  <ListBox.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
      <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
      <Setter Property="VerticalContentAlignment" Value="Stretch"/>
      <Setter Property="Padding" Value="0"/>
    </Style>
  </ListBox.ItemContainerStyle>
</ListBox>

数据模板的定义如下:

  <DataTemplate x:Name="SomeImageItemTemplate"   DataType="utilities:SomeObject">
    <Image Source ="{Binding Path=ImagePath}" 
                 VerticalAlignment="Center" HorizontalAlignment="Center" Stretch="Uniform" />
  </DataTemplate>

总体情况在我的观点中使用如下:

  <ctrls:VerticalTileBox Source="{Binding ImageListView, UpdateSourceTrigger=PropertyChanged}" ItemsTemplate="{DynamicResource SomeImageItemTemplate}"/>

结果是显示了瓷砖,但除了对象外,它们都是空的。类名(SomeObject)。

1 个答案:

答案 0 :(得分:1)

如果您作为ListBox的ItemsSource放置的数据未知且您的UserControl必须保持通用,则不能拥有通用DataTemplate。

您应该让UserControl的使用者在UserControl.Resources或DataTemplate DP中提供DataTemplate,您需要创建并绑定到ListBox的ItemTemplate。

小组不应该说明孩子的表现方式,只说明孩子应该在哪里和多大。