使用BooleanToVisibilityConverter的WPF MVVM隐藏按钮

mHe*_*pMe 24 c# wpf xaml mvvm

在我的WPF应用程序中,我试图根据用户选择的选项更改按钮的可见性.在加载时,我希望其中一个按钮不可见.我正在使用内置值转换器BooleanToVisibilityConverter.然而,由于按钮在加载时出现,因此无法正常工作.我已将属性更改为true和false,没有任何区别.下面是我的代码,我看不出我错过了什么?

我的View模型中的属性

 bool ButtCancel
    {
        get { return _buttCancel; }
        set
        {
            _buttCancel = value;
            OnPropertyChanged("ButtCancel");
        }
    }
Run Code Online (Sandbox Code Playgroud)

在我的app.xaml中

 <Application.Resources>       
    <BooleanToVisibilityConverter x:Key="BoolToVis"/>
Run Code Online (Sandbox Code Playgroud)

在我的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"/>
Run Code Online (Sandbox Code Playgroud)

Ste*_*eri 41

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

其次,ViewModel与View的绑定往往会在稍后阶段发生,因此最好也为绑定设置默认值,如此

Visibility="{Binding ButtCancel, Converter={StaticResource BoolToVis}, FallbackValue=Hidden}"
Run Code Online (Sandbox Code Playgroud)

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

  • "内部"属性也不起作用.绑定引擎不知道绑定的声明位置,因此所有非公共成员都被视为相同(实际上是"私有"). (2认同)

d.m*_*ada 7

您可以使用a而不是转换器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>
Run Code Online (Sandbox Code Playgroud)

将ViewModel的属性更新为 public

public bool ButtCancel
{
    get { return _buttCancel; }
    set
    {
        _buttCancel = value;
        OnPropertyChanged("ButtCancel");
    }
}
Run Code Online (Sandbox Code Playgroud)

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