[英]Use selectedItem of treeview from another ViewModel
选项 1:红色和蓝色视图可以共享同一个视图 model。 然后他们可以简单地绑定到相同的属性。
选项 2:如果您想坚持使用单独的视图 model 类,您可以在使用事件聚合器或信使选择项目时从RedViewModel
向BlueViewModel
发送松散耦合的消息。
如何在 MVVM WPF 应用程序中通知子视图事件的父视图?
选项 3:在两个视图模型中使用共享服务。
您不能绑定到标准 WPF TreeView
的SelectedItem
。 但是,您可以使用Beahvior
class 创建可绑定属性
public class perTreeViewHelper : Behavior<TreeView>
{
public object BoundSelectedItem
{
get => GetValue(BoundSelectedItemProperty);
set => SetValue(BoundSelectedItemProperty, value);
}
public static readonly DependencyProperty BoundSelectedItemProperty =
DependencyProperty.Register("BoundSelectedItem",
typeof(object),
typeof(perTreeViewHelper),
new FrameworkPropertyMetadata(null,
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
OnBoundSelectedItemChanged));
private static void OnBoundSelectedItemChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
if (args.NewValue is perTreeViewItemViewModelBase item)
{
item.IsSelected = true;
}
}
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.SelectedItemChanged += OnTreeViewSelectedItemChanged;
}
protected override void OnDetaching()
{
AssociatedObject.SelectedItemChanged -= OnTreeViewSelectedItemChanged;
base.OnDetaching();
}
private void OnTreeViewSelectedItemChanged(object obj, RoutedPropertyChangedEventArgs<object> args)
{
BoundSelectedItem = args.NewValue;
}
}
这样,您可以绑定到一个 ViewModel 上的属性,您可以从另一个 ViewModel 引用该属性。 显然,这两个 ViewModel 需要以某种方式链接——通常是通过将一个作为另一个的属性。
更多关于我在我的博客文章中的 WPF/MVVM 上下文中对 TreeViews 的看法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.