我有以下情况:

观看次数:

  • EbayCategoriesView(带有TreeView)
  • MaintenanceEbayCategoryView(带有类别详细信息字段)

  • ViewModels:
  • EbayAllCategoriesViewModel(带有名为EbayCategories的EbayCategoryViewModel的ObservableCollection)。
  • EbayCategoryViewModel(带有类别属性)

  • EbayCategoryViewModel具有一个公共(public)属性,即一个称为ChildrenCategories的列表。 TreeView绑定(bind)到ObservableCollection,并且TreeView的每个节点都是一个HyperLink。
    我希望单击 super 链接时,系统会打开MaintenanceEbayCategoryView并将其与EbayCategoryViewModel数据一起加载。

    我正在使用MVVM模式; EbayCategoryViewModel在构造函数中接受输入ICommand参数。当我在EbayAllCategoriesViewModel中填充ObservableCollection时,我为集合的每个元素创建一个新的RelayCommand并传递应执行的功能:
    hierarchyList.Add(new EbayCategoryViewModel(
                        item.EbayCategoryName,
                        item.EbayCategoryID,
                        FillRecursive(flatList, item.EbayCategoryID, item.EbayCategoryName),
                        parentCategoryName,
                        item.EbayOrder,
                        new RelayCommand(cmd => this.LoadCategoryDetails())
                            ));
    

    我现在的问题是,在EbayAllCategoriesViewModel的LoadCategoryDe​​tails()方法中,我没有对已单击的EbayCategoryViewModel树节点的任何引用(TreeView中的SelectedItem不是公共(public)的,而且我不确定它是否包含元素被点击...)。

    即使我找到了解决方法,我仍想了解尊重MVVM模式的正确方法是解决我的问题的方法。
    由于我已经在EbayCategoryViewModel中拥有所有类别字段,因此我可以访问被单击的当前EbayCategoryViewModel对象,而无需再次访问我的数据源。

    预先感谢您的任何建议。

    最佳答案

    为什么不在命令处理程序中将EbayCategoryViewModel实例作为参数传递。这样,您将拥有VM实例。

    hierarchyList.Add(new EbayCategoryViewModel(
                        item.EbayCategoryName,
                        item.EbayCategoryID,
                        FillRecursive(flatList, item.EbayCategoryID, item.EbayCategoryName),
                        parentCategoryName,
                        item.EbayOrder,
                        new RelayCommand(param=> this.LoadCategoryDetails(param))
                            ));
    

    在绑定(bind)命令的位置,您可以设置CommandParameter以返回DataContext,即EbayCategoryViewModel CommandParameter="{Binding}"的实例

    关于wpf - 带有WPF TreeView的MVVM主细节,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36796703/

    10-16 19:01