从模型级别创建TreeView

时间:2013-11-12 15:26:05

标签: c# wpf mvvm treeview inotifypropertychanged

我的程序中有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

中创建一个新节点

enter image description here

更新2:更新了xaml中的绑定

1 个答案:

答案 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}}