【问题标题】:How to keep elements hidden until listbox selection in parent is made?如何在父项中选择列表框之前隐藏元素?
【发布时间】:2012-07-24 12:54:53
【问题描述】:

我在 XAML 中有一个视图,其中有一个列表框,并且该列表框中的选择会使用来自所选 ChildViewModel 实例的属性填充到一侧的区域。我在 ChildView 中有几个按钮连接到 ChildViewModel 中的命令。在我从父列表框进行选择之前,这些按钮没有按预期执行任何操作。在父列表框中进行选择之前,我如何才能隐藏这些按钮,从而创建 ChildViewModel 的实例。

如果这些按钮是父视图的一部分,我知道如何通过将这些按钮的可见性绑定到 {Binding SelectedItem, ElementName=listBoxName} 来实现这一点。但是,我很难在 ChildView 中完成此操作,因为我无法访问(并且不想依赖)父视图中的元素。请帮我完成这个,最好是完全在 XAML 代码中。

【问题讨论】:

标签: c# wpf xaml mvvm visibility


【解决方案1】:

解决此问题的一种方法是基于 ViewModel 属性和绑定以及一个 ValueConverter 来管理可见性。

给定一个父视图和视图模型,子视图将具有自己的视图模型,并且父虚拟机负责子虚拟机:

父视图模型:包含列表框的 SelectedItem 绑定到的“SelectedItem”属性(根据上下文适当命名)。在 Setter 中,在孩子的 VM 上设置一个布尔属性。 (即 ParentItemSelected)Child 的控件 Visibility 属性通过值转换器绑定到 ParentItemSelected,该值转换器将布尔值转换为合适的 Visibility 值。

如果父视图和子视图共享一个虚拟机,那么同样的工作,只是基于“SelectedItem”是否为空的可见性。 (或者可以使用类似的布尔属性。)

【讨论】:

  • 如果您正在加载子视图并试图以纯粹的方式遵循 MVVM,那么我同意来自 ViewModel 的信号是要走的路。我不知道正在使用什么 MVVM 框架(如果有的话),但是 MVVMLight 有一个出色的松散耦合 Messenger 类,非常适合这个。
  • 我不明白这将如何工作。在调用构造函数之后,不会初始化子VW中存在的任何布尔属性(选择列表框项时) span>
【解决方案2】:

根据 EdFred 的建议,您可以使用 MVVMLight 及其 Messenger 功能来解耦依赖对象之间的通信。 Here 就是一个例子。

如果您没有使用任何 MVVM 框架,您仍然可以在父视图模型上公开一个事件,该事件可以从子视图模型订阅。当父视图中的选择发生变化时,您可以在子视图模型上执行您希望执行的任何操作。

【讨论】:

  • 我没有使用任何 MVVM 框架。我的问题是 gui 启动时尚未创建子实例,因此我在子视图模型中执行的任何操作都不会在实际选择项目之前完成。
【解决方案3】:

您应该能够检查子视图的数据上下文是否为空(即没有设置 ChildViewModel)。如果为空,则隐藏按钮。

<Button Click="Button_Click" Content="bah">
        <Button.Style>
            <Style TargetType="Button">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Window, Mode=FindAncestor}, Path=DataContext}" Value="{x:Null}" >
                        <Setter Property="Visibility" Value="Collapsed"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>

将祖先设置为包含您的子视图的任何容器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多