C# Catel和TreeView示例

C# Catel和TreeView示例,c#,mvvm,catel,C#,Mvvm,Catel,我发现了一个将Catel与TreeView结合使用的示例,但不幸的是,这个示例构建在Catel版本3.3上,我尝试在Catel版本4.0上重复它,但不幸的是,它不起作用 当我尝试在我的项目(基于Catel版本4.0)中绑定到类TreeViewItemToDataContext中的属性时,UserControl中对ViewModel的引用丢失。 但该示例基于3.3版,一切正常。我想使用IViewModelManager手动获取链接,但不幸的是,在版本4中,viewModel没有在版本3.3中生成

我发现了一个将Catel与TreeView结合使用的示例,但不幸的是,这个示例构建在Catel版本3.3上,我尝试在Catel版本4.0上重复它,但不幸的是,它不起作用

当我尝试在我的项目(基于Catel版本4.0)中绑定到类TreeViewItemToDataContext中的属性时,UserControl中对ViewModel的引用丢失。

但该示例基于3.3版,一切正常。我想使用IViewModelManager手动获取链接,但不幸的是,在版本4中,viewModel没有在版本3.3中生成,一切正常

问题:如何在Catel 4.0版上运行该示例? 附言

更新

public class TreeViewItemToDataContext : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var uc = value as Catel.Windows.Controls.UserControl;

        if (uc != null)
        {
            uc.ViewModelChanged += this.OnViewModelChanged;
            return uc.DataContext;
        }

        return Binding.DoNothing;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    private void OnViewModelChanged(object sender, EventArgs eventArgs)
    {
        var uc = sender as Catel.Windows.Controls.UserControl;
        if (uc != null)
        {
            var visualParent = uc.TemplatedParent as ContentPresenter;
            if (visualParent != null)
            {
                var treeViewItem = visualParent.TemplatedParent as TreeViewItem;
                if (treeViewItem != null)
                {
                    var IsSelectedBinding = new Binding("IsSelected");
                    IsSelectedBinding.Mode = BindingMode.TwoWay;
                    IsSelectedBinding.Source = uc.ViewModel;
                    treeViewItem.SetBinding(TreeViewItem.IsSelectedProperty, IsSelectedBinding);

                    var IsExpandedBinding = new Binding("IsExpanded");
                    IsExpandedBinding.Mode = BindingMode.TwoWay;
                    IsExpandedBinding.Source = uc.ViewModel;
                    treeViewItem.SetBinding(TreeViewItem.IsExpandedProperty, IsExpandedBinding);

                    uc.ViewModelChanged -= this.OnViewModelChanged;
                }
            }
        }
    }
}
扩展命令

 private void OnSetFocusAndExpandCommandExecute()
    {
        var model = this.ProviderGroups[0]; // open First Level
        var viewModelManager = this.GetServiceLocator().ResolveType<IViewModelManager>();
        var viewModels = viewModelManager.GetViewModelsOfModel(model);
        if (viewModels.Length > 0)
        {
            // NOTE: Somehow there are two viewmodels per model 
            var viewModel = viewModels[0] as TreeViewItemViewModel;
            if (viewModel != null)
            {
                //viewModel.IsSelected = true;
                viewModel.IsExpanded = true;
            }
        }

        var model1 = this.ProviderGroups[0].Categories.First();  // open Second Level
        var viewModels1 = viewModelManager.GetViewModelsOfModel(model1); // ViewModel Not created. 
        if (viewModels1.Length > 0)
        {
            // NOTE: Somehow there are two viewmodels per model 
            var viewModel1 = viewModels1[0] as TreeViewItemViewModel;
            if (viewModel1 != null)
            {
                viewModel1.IsSelected = true;
                viewModel1.IsExpanded = true;
            }
        }
    }
OnSetFocusAndExpandCommandExecute()上的私有void
{
var model=this.ProviderGroups[0];//打开第一级
var viewModelManager=this.GetServiceLocator().ResolveType();
var viewModels=viewModelManager.GetViewModelsOfModel(model);
如果(viewModels.Length>0)
{
//注意:每个模型有两个视图模型
var viewModel=viewModels[0]作为TreeViewItemViewModel;
if(viewModel!=null)
{
//viewModel.IsSelected=true;
viewModel.IsExpanded=true;
}
}
var model1=this.ProviderGroups[0]。Categories.First();//打开第二级
var viewModels1=viewModelManager.GetViewModelsOfModel(model1);//未创建ViewModel。
如果(viewModels1.Length>0)
{
//注意:每个模型有两个视图模型
var viewModel1=viewModels1[0]作为TreeViewItemViewModel;
如果(viewModel1!=null)
{
viewModel1.IsSelected=true;
viewModel1.IsExpanded=true;
}
}
}

Catel中的视图模型现在只在真正需要的时候加载(延迟加载),而不是急于加载。如果覆盖用户控件上的OnViewModelChanged,您将看到稍后将对其进行设置


您可以在已转换的浏览器中订阅ViewModelChanged事件,并等待第一个事件(请不要忘记取消订阅)。

谢谢您,Geert。我将TreeViewItem更改为DataContext,现在我可以扩展第一级,但如果我想打开第二级呢。如果我写这段代码(请参阅更新我的第一篇文章),第二级的ViewModel甚至不会被创建。另外,也许你知道一种更优雅的方法来使用Treeview?