C# Catel和TreeView示例
我发现了一个将Catel与TreeView结合使用的示例,但不幸的是,这个示例构建在Catel版本3.3上,我尝试在Catel版本4.0上重复它,但不幸的是,它不起作用 当我尝试在我的项目(基于Catel版本4.0)中绑定到类TreeViewItemToDataContext中的属性时,UserControl中对ViewModel的引用丢失。 但该示例基于3.3版,一切正常。我想使用IViewModelManager手动获取链接,但不幸的是,在版本4中,viewModel没有在版本3.3中生成,一切正常 问题:如何在Catel 4.0版上运行该示例? 附言 更新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中生成
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?