我有以下情况:
观看次数:
ViewModels:
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的LoadCategoryDetails()方法中,我没有对已单击的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/