MVVM:在(Silverlight)中管理与treeview的多对多关系

时间:2011-05-05 08:39:00

标签: silverlight mvvm mvvm-light silverlight-toolkit

很抱歉只提出一个广泛的问题,但我无法思考如何解决这个问题。

我有很多关系:

Product 1 --- * ProductCategory * --- Category

类别也有:

Category 0..1 --- * Category (As SubCategories)

我希望看到包含所有类别的树视图,并且能够选中复选框以创建ProductCategory实体。我不知道如何使用MVVM来解决这个问题。

enter image description here

在ASP.NET中,当渲染树视图时,我会检查我正在渲染的节点的CategoryId是否在我的“ProductCategory”列表中,如果是,我会选中该框,然后设置初始化状态。

然后我会将事件处理程序附加到节点(可能还有一些数据),这样当选中/取消选中复选框时,它会从我的列表中添加/删除相应的实体。

问题是我正在努力向MVVM迈进,有时候看到它有多么有用,虽然有些东西更整洁,做任何复杂的事情似乎都很痛苦!例如,我的初衷是将顶级类别(Root)绑定到树上,并使用HierarchicalDataTemplate呈现所有实体:

                <sdk:TreeView Margin="0,3,30,3" ItemsSource="{Binding Categories}" Height="300">
                    <sdk:TreeView.ItemTemplate>
                        <sdk:HierarchicalDataTemplate ItemsSource="{Binding SubCategories}">
                            <StackPanel Orientation="Horizontal">
                                <CheckBox></CheckBox>
                                <TextBlock Text="{Binding Name}" HorizontalAlignment="Left"></TextBlock>
                            </StackPanel>
                        </sdk:HierarchicalDataTemplate>
                        <!---->
                    </sdk:TreeView.ItemTemplate>

问题在于我无法将我的复选框绑定到任何内容,因为Category没有可用于将其附加到产品的字段...

MVVM大师能不能对此有所了解,还是应该沿着“事件”路线走下去?

非常感谢。

1 个答案:

答案 0 :(得分:0)

一种方法是将IsChecked属性添加到类别viewmodel,然后将其绑定到复选框。当它的get设置为true时,viewmodel可以调用where。例如,它可以将自己的产品名称添加到另一个控件的过滤器集合中。

mvvm模式的一个强大之处在于视图模型可以引用彼此或其他内容,并且还具有您不希望放入实际实体中的属性