WPF按钮可见性

时间:2010-08-17 23:14:41

标签: wpf data-binding

我正在使用MVVM架构开发WPF应用程序......

到目前为止,一切都很顺利。

我遇到了绑定可见性的问题。如果可以,我想尽量减少在代码中编写代码,但如果需要,那么我不介意这样做。

我有一个ViewModel。这个模型公开了一个布尔值和2个命令。 connect命令,disconnect命令和DeviceCurrentlyConnected Bool。

基本上我已经决定制作2个按钮但是根据布尔值可以看到按钮。

所以我很难过。我用触发器试了很长时间的样式。

<Button Visibility="Hidden" Content="{x:Static UIStrings:ClientStrings.DeviceBar_DisconnectCommandName}" VerticalAlignment="Center" HorizontalAlignment="Center" Height="{Binding ElementName=this.Content, Path=DesiredHeight}" Margin="10" Name="Disconnect" Command="{Binding DisconnectCurrentDeviceCommand}">
    <Button.Style>
        <Style TargetType="Button">
            <Style.Triggers>
                <DataTrigger Binding="{Binding DataCotext.DeviceConnected, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}" Value="True">
                    <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

我根本无法使用样式。

基本上我想要的功能是:

DeviceConnected = false: 显示包含内容的按钮Connect和命令绑定到ConnectCommand。

DeviceConnected = true: 显示内容断开的按钮和绑定到DisconnectCommand的命令。

用于当没有设备当前连接时显示并绑定到连接设备的按钮,以及当连接设备连接到断开连接命令并显示断开连接时显示按钮。

2 个答案:

答案 0 :(得分:2)

写一个bool到可见性转换器,然后在按钮上使用转换器。 Five minute recipe for a decent BoolToVisibilityConverter是阅读创建/使用可见性转换器的好文章。

我过去所做的是使用bool到可见性转换器,并将按钮的IsEnabled属性作为转换器的参数传递。由于使用CanExecute方法通过模型中的命令取消/启用按钮,因此可以使用IsEnabled属性设置按钮与转换器的可见性。

答案 1 :(得分:1)

你的触发器不起作用的原因是该样式被按钮本身的属性覆盖。

您可以使用Metro Smurf建议的转换器,或者您可以将visibility属性移动到样式中,以便触发器正常工作

只需添加:

<Style.Setters>
    <Setter Property="Visibility" Value="Hidden" />
</Style.Setters>

到样式然后删除属性。