小编sb.*_*son的帖子

ItemsControl与WrapPanel一起作为ItemsPanel - 组合一个"静态"子项和ItemsSource

使用带有WrapPanel设置为ItemsPanel的ItemsControl,我试图实现此图像中说明的内容: 使用WrapPanel作为ItemsPanel的ItemsControl

XAML看起来像这样(修改后使其更简单):

<ItemsControl ItemsSource="{Binding Animals}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel IsItemsHost="True" Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border Margin="5">
                <Image Source="{Binding ImageUrl}" />
            </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)

底层的ViewModel如下所示:

public class Zoo
{
    public ObservableCollection<Animal> Animals { get; set; } = new ObservableCollection<Animal>(); 

    public ICommand AddAnimal() => new DelegateCommand(() => Animals.Add(new Animal()));
}

public class Animal
{
    public string ImageUrl { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

ItemsControl的DataContext设置为Zoo的一个实例,并填充4个Animals.

问题: 如何添加一个看起来像其他元素的"静态"子元素,是WrapPanel的子元素,并与其他子元素包装?具体来说,我希望最后一个元素是一个添加按钮(上图中显示的绿色加号),它绑定到Zoo的AddAnimal Command属性.

要求:

  • add-button-element必须与WrapPanel的其他子项一起包装.
  • add-button-element必须始终是最后一个(或第一个)元素,如果Zoo中没有Animals,也应该是可见的.
  • 将一个虚拟Animal添加到Animals集合中然后使用样式来修改最后一个子节点不是一个选项.底层模型在应用程序中使用了很多地方,因此在动物集合中放置一个虚拟动物太过于愚蠢.

我考虑过:

  • 使用将Animals-collection复制到新集合的转换器,将一个虚拟Animal添加到副本,然后将其返回到ItemsControl的ItemsSource绑定.然后我可以将最后一个元素设置为添加按钮.但是,这不是一个选项,因为一些拖放逻辑需要能够通过ItemsControl的ItemsSource属性处理原始的ObservableCollection.
  • 对WrapPanel进行子类化并将add-button-element添加为子元素而不修改ItemsSource属性似乎是最佳选择(如果可能),但我无法弄清楚如何做到这一点.

附加信息:我使用:WPF,PRISM,C#6.0,.NET 4.0 Client Profile和MVVM模式.

有关这个问题的任何想法?

解: …

c# wpf xaml

6
推荐指数
1
解决办法
1006
查看次数

标签 统计

c# ×1

wpf ×1

xaml ×1