【问题标题】:Can Converter know about parent control?Converter 可以知道家长控制吗?
【发布时间】:2019-12-08 09:08:04
【问题描述】:

我有一个Prism Core MVVM 应用程序,它重用了一些视图,例如 CustomerView。最初,CustomerView 在MainWindowView 中显示为“图块”。当用户单击它时 - 使用我的 WindowService 在新的Window 中打开该 CustomerView 的新实例。 CustomerView 有一个菜单。我想要什么:如果 CustomerView 显示在 MainWindowView 的“平铺”中 - 菜单应该被隐藏;如果在另一个不同的Window - 菜单应该是可见的。目前,我已经通过代码隐藏完成了这项工作。是否有可能有一个Converter,它可以判断 CustomerView 是 MainWindowView 的一部分,还是其他 Window 的一部分?

【问题讨论】:

  • Prism 适用于非 windows 的区域。因此,您可以检查哪些视图位于某个区域内。
  • @Gleb - 它对我没有帮助,我需要它反过来 - 转换器,在视图中使用,以确定它托管在哪个区域内
  • 我会重用下一层,为主窗口创建一个不带菜单的视图,为带菜单的详细视图创建一个带菜单的视图,两者都使用第三个视图作为公共内容。这三个也可以共享相同的视图模型。我想,迟早,瓦片将与详细视图不同,而不仅仅是菜单的存在,无论如何,您将能够减少常见内容......

标签: wpf mvvm prism


【解决方案1】:

您可以绑定到 CustomerView 本身并使用帮助方法尝试在可视化树中找到父 MainWindowView

public static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject
{
    var parent = VisualTreeHelper.GetParent(dependencyObject);

    if (parent == null) return null;

    var parentT = parent as T;
    return parentT ?? FindParent<T>(parent);
}

用法:

MainWindowView parent = FindParent<MainWindowView>(customerView);
if (parent != null)
    //MainWindowView found...

【讨论】:

  • 嗯,它应该可以正常工作,但我没有提到我的 CustomerView 驻留在 ContentControl(Prism 区域)中,并使用 Prism 的 regionManager.RequestNavigate 方法显示。在这种情况下 FindParent(customerView) 总是返回 null,无论我为它指定什么类型
  • 似乎可以工作,如果我在 FindParent 中使用 LogicalTreeHelper 而不是 VisualTreeHelper
  • @AlexeyTitov:你的问题在哪里?你的问题解决了吗?
  • 是的,它已解决 - 如果我在 FindParent 方法中使用 LogicalTreeHelper 而不是 VisualTreeHelper
猜你喜欢
  • 1970-01-01
  • 2018-05-22
  • 2011-10-08
  • 2013-03-25
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多