我的程序中有TreeView
,需要从MVVM结构的数据模型级别实现。它需要以这种方式实现,以便程序将其保存在数据中。我的程序在不同的窗口之间切换,如果树只与视图模型级别一样深,则在这些切换期间树会丢失。我有数据工作,但视图没有回报(我似乎最近有很多问题)。
我会在这里发布我的流程。请记住此TreeView
:
-Usercontrol(包含TreeView) - > ViewModel->模型(TreeView需要存储在此模型中)
-TreeView-> ViewModel->型号
UserControl模型:
public BlockingTreeViewModel _blockDataTree;
public BlockingDatabaseModel() { }
public BlockingTreeViewModel BlockDataTree {...}
UserControl视图模型:
public BlockingDatabaseModel _blockingModel;
public BlockingDatabaseViewModel(BlockingDatabaseModel model, BlockingTreeViewModel blockingTreeView)
{
BlockingModel = model;
BlockingModel.BlockDataTree = blockingTreeView;
}
public BlockingDatabaseModel BlockingModel {...}
public BlockingTreeViewModel BlockingTree //PROXY PROPERTY
{
get { return BlockingModel.BlockDataTree; }
set
{
BlockingModel.BlockDataTree = value;
NotifyPropertyChange(() => BlockingTree);
}
}
UserControl.xaml:
<TreeView ItemsSource="{Binding BlockingModel.BlockDataTree.BlockTree}" ... />
现在,添加到此TreeView
后,我可以在调试时看到新节点,但View不会显示任何新创建的节点。至于我对这种情况的理解,这是正确实现的,应该可以正常工作。请帮我解释为什么视图不会在UserControl中显示这个树。
现在上述更改已应用于我的xaml,树节点已创建并显示。但是,每当我更改屏幕时,这些节点都会消失。这意味着我的TreeView
在此MVVM结构中仍然存在问题。
*注意:TreeView
的属性只是代理属性,因为它使我的代码在我的程序的其他区域更简单。这不应该影响我正在做的事情。
更新1:
调试期间我的“Locals”窗口的屏幕截图。这表明我能够在TreeView
。
更新2:更新了xaml中的绑定
答案 0 :(得分:0)
如果您要切换包含TreeViews
的屏幕,则每次查看ObservableCollection
时都不应创建新的TreeView
,因为它会重置当前的ObservableCollection
。
我这样说是因为每次切换回TreeView
时,我都会在TreeViewViewModel
的ViewModel中创建一个新的public BlockingTreeViewModel()
{
BlockTree = new ObservableCollection<BlockingTreeModel>();
}
。
我//Pass the ObservableCollection from a different area of your code each time
//you use BlockingTreeViewModel so that you don't overwrite it.
public BlockingTreeViewModel(ObservableCollection<BlockingTreeModel> treeCollection)
{
BlockTree = treeCollection;
}
的构造函数:
{{1}}
,而不是...
{{1}}