使用BooleanToVisibilityConverter的WPF MVVM隐藏按钮

时间:2013-12-13 15:31:03

标签: c# wpf xaml mvvm

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

我的视图模型中的属性

 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"/>

2 个答案:

答案 0 :(得分:38)

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

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

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

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

答案 1 :(得分:7)

您可以只使用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