0

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

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

4

3 回答 3

2

您应该能够检查子视图的数据上下文是否为空(即没有设置 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>

将祖先设置为持有您的子视图的任何容器

于 2012-07-26T05:06:58.670 回答
0

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

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

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

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

于 2012-07-26T01:10:12.137 回答
0

正如 EdFred 所建议的,您可以使用 MVVMLight 及其 Messenger 功能来解耦依赖对象之间的通信。是一个如何做到这一点的示例。

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

于 2012-07-26T04:16:30.493 回答