在WPF中,如何设置按钮的单击事件以更改网格的可见性?

时间:2010-10-08 04:23:38

标签: wpf xaml mvvm visibility

我正在尝试设置按钮的事件,仅使用XAML更改网格的可见性。我很确定我应该使用EventTrigger,但是我无法使用它,所以我最近的尝试是创建一个绑定到视图模型中的字段的DataTrigger:

<Style x:Key="PersonalInfoGridStyle" TargetType="{x:Type Grid}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=PersonalInfoGridVisibility}" Value="Collapsed">
            <Setter Property="Grid.Visibility" Value="Collapsed"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

上面的代码不起作用,但对于我来说,仅仅在XAML中实现整个事情(不使用视图模型或代码隐藏)对我来说并不重要。

有人可以解释我应该如何解决这个问题,或者甚至是否可能? :)感谢前方

3 个答案:

答案 0 :(得分:11)

您可以使用切换按钮吗?

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.Resources>
            <BooleanToVisibilityConverter x:Key="boolConverter" />
        </Grid.Resources>

        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <ToggleButton Content="Click Me" x:Name="toggleMe" Grid.Row="0" />
        <Grid Grid.Row="1" Background="Black" Visibility="{Binding ElementName=toggleMe, Path=IsChecked, Converter={StaticResource boolConverter}}">

        </Grid>
    </Grid>
</Window>

答案 1 :(得分:2)

好的,我想出了我将如何做到这一点(使用视图模型)。我在Visibility类型的视图模型中创建了一个对象(NOT STRING),然后我使用Grid中的Binding属性将网格中的Visibility属性绑定到视图模型中的Visibility对象。

现在我需要做的就是让按钮的事件将可见性对象(ONE LINE!)更改为可见,如下所示:

<Grid Visibility="{Binding Path=GridVisibility">
    [content here]
</Grid>

在视图模型中:

private Visibility _gridVisibility = Visibility.Visible;
public Visibility GridVisibility
{
    get
    {
        return _gridVisibility;
    }
}

使用您的MVVM方法自己设置属性(我故意将其保留)。

最后,只需将按钮的click事件绑定到一个方法,该方法只需将GridVisibility的值更改为Visibility.Hidden或Visibility.Collapsed。

答案 2 :(得分:1)

您可以使用EventTrigger在纯xaml中执行此操作。

<Window x:Class="WpfApp3.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<StackPanel Width="64" VerticalAlignment="Center">
    <Grid x:Name="grd" Background="Black" Height="48"/>
    <Button Height="48" Content="Hide Grid">
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.Click">
                <BeginStoryboard>
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="grd" Storyboard.TargetProperty="Visibility">
                            <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Hidden}"/>
                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Button.Triggers>
    </Button>
</StackPanel>