【问题标题】:MVVM: Manage many to many relationship with treeview in (Silverlight)MVVM:在(Silverlight)中管理与树视图的多对多关系
【发布时间】:2011-08-19 04:29:18
【问题描述】:

很抱歉问了一个很宽泛的问题,但我在思考如何解决这个问题时遇到了麻烦。

我有一个多对多的关系:

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

类别也有:

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

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

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

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

问题是我正在尝试转向 MVVM,有时会看到它到底有什么帮助,虽然有些事情更整洁,但做任何复杂的事情似乎都很痛苦!例如,我最初的想法是将顶级类别(根)绑定到树,并使用 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 专家对此有所了解,还是我应该简单地走“事件”路线?

非常感谢。

【问题讨论】:

  • 您好,如何为您的 Category 创建 IsSelected 属性,并将 CheckBox 的 IsChecked 绑定到它。那么您可以将所有选定的类别附加到您的产品中吗?
  • 我不想将仅用于视图的东西添加到我的实体中,这看起来不像是 'MVVM' 方式。
  • 我认为 Xin 的意思是你可以将它添加到你的虚拟机中

标签: silverlight mvvm mvvm-light silverlight-toolkit


【解决方案1】:

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

mvvm 模式的强项之一是视图模型可以相互引用或引用其他事物,并且还具有您不想放入实际实体中的属性

【讨论】:

  • 所以不是直接将 Category 绑定到树,而是创建 CategoryViewModels 并绑定它们?我将如何处理缓存这些对象,或者我会在每次显示页面时创建视图模型(从实体)?另外,我会创建这个视图模型仅用于这个控件吗?例如,在编辑类别(使用 CategoryViewModel)时,IsChecked 标志没有意义。
  • 你可能不会缓存视图模型,至少不要一开始,你可以随时优化。是的,您可能只会将此视图模型用于此控件,但通常不是这样吗?视图和视图模型之间的 1-1 关联。不过可能还有其他方法:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 2012-06-30
相关资源
最近更新 更多