使用 BooleanToVisibilityConverter 的 WPF MVVM 隐藏按钮

Posted

技术标签:

【中文标题】使用 BooleanToVisibilityConverter 的 WPF MVVM 隐藏按钮【英文标题】:WPF MVVM hiding button using BooleanToVisibilityConverter 【发布时间】:2014-01-01 10:29:23 【问题描述】:

在我的 WPF 应用程序中,我试图根据用户选择的选项更改按钮的可见性。在加载时,我希望其中一个按钮不可见。我正在使用内置值转换器 BooleanToVisibilityConverter。但是它不起作用,因为按钮在加载时出现。我已将属性更改为真假,没有区别。下面是我的代码,我看不到我缺少什么?

我的视图模型中的属性

 bool ButtCancel
    
        get  return _buttCancel; 
        set
        
            _buttCancel = value;
            OnPropertyChanged("ButtCancel");
        
    

在我的 app.xaml 中

 <Application.Resources>       
    <BooleanToVisibilityConverter x:Key="BoolToVis"/>

在我的 MainWindow.xaml 中

 <Button Grid.Column="2" 
      Command="Binding CommandButtProgressCancel" 
      Content="Cancel" 
      Visibility="Binding ButtCancel, Converter=StaticResource BoolToVis"
      IsEnabled="Binding ButtCancelEnabled" 
      Height="50" Width="120" 
      HorizontalAlignment="Center" 
      VerticalAlignment="Center" Margin="0,0,50,20"/>

【问题讨论】:

您的ButtCancel 属性是public 吗?它在您的代码摘录中没有访问修饰符,这将使它成为private,因此对绑定引擎不可见。此外,您不应该绑定 IsEnabled 属性;让按钮使用命令的CanExecute 回调来确定自己的状态。 @MikeStrobel,当然默认访问修饰符是internal 而不是private 是的,不敢相信我错过了!它不公开 @Sheridan 对于***声明,默认为internal;对于类成员,包括嵌套类型声明,它是private 【参考方案1】:

对于初学者来说,如果您使用的是Command,那么您不需要绑定IsEnabled,命令实现应该决定这一点。

其次,ViewModel 到 View 的绑定往往会在稍后的阶段发生,所以最好也为绑定设置一个默认值,像这样

Visibility="Binding ButtCancel, Converter=StaticResource BoolToVis, FallbackValue=Hidden"

第三,正如 Mike 指出的,确保您的属性是公开的,因为 ViewModel 和 View 是两个独立的类。

【讨论】:

internal 属性也不起作用。绑定引擎不知道绑定的声明位置,因此所有非公共成员都被同等对待(实际上是private)。 哦,我不知道,谢谢 Mike,我会调整我的答案。【参考方案2】:

您可以使用DataTrigger,而不是使用转换器。

<Button Grid.Column="2" Command="Binding CommandButtProgressCancel" Content="Cancel" 
        Visibility="Binding ButtCancel, Converter=StaticResource BoolToVis" 
        IsEnabled="Binding ButtCancelEnabled" Height="50" Width="120"
        HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,50,20">
    <Button.Style>
        <Style TargetType=X:Type Button>
            <!-- This would be the default visibility -->
            <Setter Property="Visibility" Value="Visible" />
            <Style.Triggers>
                <DataTrigger Binding="Binding ButtCancel, UpdateSourceTrigger=PropertyChanged" Value="True">
                    <Setter Property="Visibility" Value="Hidden" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

将 ViewModel 的属性更新为 public

public bool ButtCancel

    get  return _buttCancel; 
    set
    
        _buttCancel = value;
        OnPropertyChanged("ButtCancel");
    

并确保您的 MainWindow 的 DataContext 设置为 ViewModel

【讨论】:

如果您尝试使用 MVVM 模式(正如 OP 所说),触发器并不是最好的。

以上是关于使用 BooleanToVisibilityConverter 的 WPF MVVM 隐藏按钮的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)