绑定到CompositeCollection内的单个元素

Moj*_*ter 6 wpf treeview xaml mvvm

我正在尝试生成一个服务器列表,以便在网络上进行浏览,从而生成一个如下所示的树视图:

-Local Server
 - Endpoint 1
 - Endpoint 2
-Remote
 - <Double-click to add a server...>
 - Remote Server 1
   - Endpoint 1
   - Endpoint 2
 - Remote Server 2
   - Endpoint 1
   - Endpoint 2
Run Code Online (Sandbox Code Playgroud)

我的ViewModel看起来像这样:

...
public Server LocalServer;
public ObservableCollection<Server> RemoteServers;
...
Run Code Online (Sandbox Code Playgroud)

那么,如何通过绑定到单个对象对象列表来构建xaml中的列表呢?我可能会以完全错误的方式思考它,但我的大脑真正希望能做的是这样的事情:

<CompositeCollection>
  <SingleElement Content="{Binding LocalServer}"> 
  <!-- ^^ something along the lines of a ContentPresenter -->
  <TreeViewItem Header="Remote">
    <TreeViewItem.ItemsSource>
      <CompositeCollection>
        <TreeViewItem Header="&lt;Click to add...&gt;" />
        <CollectionContainer Collection="{Binding RemoteServers}" />
      </CompositeCollection>
    </TreeViewItem.ItemsSource>
  </TreeViewItem>
</CompositeCollection>
Run Code Online (Sandbox Code Playgroud)

我觉得必须有一个我缺少的基本元素,这使我无法在这里指定我想要的东西.那个单品有孩子.我确实尝试使用ContentPresenter,但无论出于何种原因,它都无法扩展,即使它选择了HierarchicalDataTemplate正确显示标题.


更新

所以现在,我已经在视图模型上公开了一个属性,该属性将单个元素包装在一个集合中,以便CollectionContainer可以绑定它.不过,我真的很想听听人们如何做到这一点的想法.这似乎非常重要.

And*_*mes 2

我发布了一个与您的关于 CompositeCollections 非常相似的问题:Why is CompositeCollection not Freezable?

不管你信不信,这显然是 WPF 中的一个错误。这是微软员工承认的帖子:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/b15cbd9d-95aa-47c6-8068-7ae9f7dca88a

CompositeCollection 不可冻结,但应该可以。这使得将非静态元素组合到一个集合中变得困难。这是很多事情的常见场景。例如,填充有其他数据绑定对象的组合框顶部的“选择一个”元素会很好,但您不能以声明方式执行此操作。

不管怎样,很抱歉这不是一个答案,但希望它能帮助您了解为什么这没有按照您想象的方式工作。

  • 这实际上不是我想要解决的问题。对于您所描述的情况,我通常使用 CollectionViewSource 来托管动态元素。然后,CollectionViewSource 与静态元素一起很好地放置在 CollectionContainer 中,并且每个人都可以很好地协同工作。-- 我在这里要解决的问题是如何将视图模型中的单个元素直接动态绑定到 CompositeCollection 中。不过,您肯定会得到我的签名,让 CompositeCollection 可冻结。 (2认同)