【问题标题】:Show a control in designer when the Visiblity's Fallbackvalue is set to 'Hidden'当 Visiblity 的 Fallbackvalue 设置为“隐藏”时,在设计器中显示控件
【发布时间】:2018-06-15 02:59:24
【问题描述】:

在几个视图中,我们有容器组件——例如GridScrollViewer——它们绑定到它们自己的 ViewModel 或 ViewModelItem 上的属性。

在某些情况下,包含这些组件的视图(父级)可以在未初始化组件的 ViewModel/ViewModelItem 的情况下显示。为了避免向用户显示空数据网格,我们使用FallBackValue=Hidden 来确保容器仅在其 ViewModel/ViewModelItem 初始化/加载时显示。

一个假设的例子是一个Window 包含一个DataGrid 和右侧更详细的视图。详细视图将是它自己的UserControl 和它自己的 ViewModel,DataGrid 也将有它自己的ViewModel。当打开说Window时,DataGrid的ViewModel会被立即加载——但是由于没有选择行,属于详细视图的ViewModel不会被初始化,这意味着Visibility绑定详细视图将失败并且绑定的FallbackValue 将用于隐藏详细视图。 这种方法的问题在于,Visual Studio WPF/XAML 设计器不会显示受影响容器的内容,因为它们因其 FallbackValue 而被隐藏。

问题:有没有办法让设计器显示将FallBackValueVisibility 绑定设置为Hidden 的特定控件/组件?单击这些隐藏容器中的 XAML 代码不会显示它们。


编辑 1

我找到了this 的答案。设置d:IsHidden="false" 没有帮助。无论是在Visibility 属性之前还是之后设置。

【问题讨论】:

  • 您是否设置了设计数据上下文?我们可以使用一些代码示例。 xmlns:vm="clr-namespace:VM.ViewModel"然后d:DataContext ="{d:DesignInstance {x:Type vm:YourViewModelNameHere}, IsDesignTimeCreatable=True}"
  • @XAMlMAX 哇,这是一个不错的 sn-p,它适用于少数情况!我唯一的问题是,在大多数情况下,ViewModel 的构造函数会调用其他类的方法——由于 MEF——设计者不知道这些方法。
  • 我认为 Blend 为您创建 Design Time 实例提供了更大的灵活性,请查看this MSDN post
  • @XAMlMAX 是的,大约 30 分钟前偶然发现了这个;)。此刻似乎有点压倒性的。我目前的想法是创建特定类型的子类并使用子类型的默认构造函数。哦,您也可以将您的 cmets 重新表述为答案吗?因为这基本上解决了我的问题。

标签: wpf xaml visual-studio-2017 designer


【解决方案1】:

对于设计器,您必须设置设计数据上下文。
为此,您通常会在您的 xaml 文件中执行以下操作:

<Control, Page or Window
    xmlns:vm="clr-namespace:VM.ViewModel"
    d:DataContext="{d:DesignInstance {x:Type vm:YourViewModelNameHere}, IsDesignTimeCreatable=True}" 
    .../>  

但是,有时就像您的情况一样,复杂的 ViewModel 需要更大的灵活性。为此,我将使用 Blend 及其功能,它会为您生成虚拟数据并为您设置控件的数据上下文。
有关详细信息,请参阅这篇 MSDN 文章。

【讨论】:

  • 谢谢!至于 ViewModel 的默认构造函数调用 MEF 或其他会引发异常的方法的情况,我创建了一个 subclass,添加了一个默认构造函数,将绑定属性设置为适当的值。然后,我向具有虚拟参数的 ViewModel 添加了一个新构造函数 - 我为该构造函数创建了一个 DummyDesigner 类 - 并使用 : base(new DummyDesigner()) 语法使子类的默认构造函数在 ViewModel 上调用该新构造函数
猜你喜欢
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
  • 2012-04-17
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
相关资源
最近更新 更多