【问题标题】:WPF Button VisibilityWPF 按钮可见性
【发布时间】:2011-03-31 06:41:54
【问题描述】:

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

到目前为止一切都很好。

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

我有一个 ViewModel。该模型公开了一个布尔值和 2 个命令。一个连接命令、一个断开连接命令和一个 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 = 假: 显示一个按钮,其中包含内容 Connect 和绑定到 ConnectCommand 的命令。

DeviceConnected = 真: 显示一个按钮,其中包含内容断开连接和绑定到 DisconnectCommand 的命令。

当当前没有设备连接时显示按钮并绑定到连接设备,当设备连接时显示按钮,该按钮绑定到断开命令并说出单词disconnect。

【问题讨论】:

  • 绑定是{Binding DataCotext.DeviceConnected ...} 还是拼写错误?即,不是{Binding DataContext.DeviceConnected ...}
  • 您的权利。它应该是数据上下文。我的实际代码是正确的:P.

标签: wpf data-binding


【解决方案1】:

编写一个布尔到可见性转换器,然后在您的按钮上使用转换器。 Five minute recipe for a decent BoolToVisibilityConverter 是一篇关于创建/使用可见性转换器的好文章。

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

【讨论】:

    【解决方案2】:

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

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

    只需添加:

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

    给样式然后去掉属性。

    【讨论】:

      猜你喜欢
      • 2012-05-31
      • 2011-12-15
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      相关资源
      最近更新 更多