如何在父项中选择列表框之前保持元素隐藏?

时间:2012-07-26 00:42:30

标签: c# wpf xaml mvvm visibility

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

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

3 个答案:

答案 0 :(得分:2)

您应该能够检查子视图的datacontext是否为空(即没有设置ChildViewModel)。如果为null则隐藏按钮。

<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>

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

答案 1 :(得分:0)

解决此问题的一种方法是基于ViewModel属性和绑定执行信令,并使用ValueConverter来管理可见性。

鉴于父母观点&amp; View Model,具有自己的View Models的子View,而父的VM负责子VM:

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

如果父视图和子视图共享一个VM,那么同样的事情可行,但只是对“SelectedItem”是否为null的基本可见性。 (或者可以使用类似的布尔属性。)

答案 2 :(得分:0)

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

如果您没有使用任何MVVM框架,您仍然可以在父视图上公开可以从子视图模型订阅的事件。当选择在父项中更改时,您可以执行要在子视图模型上执行的任何操作。