Подтвердить что ты не робот

Кнопка скрытия WPF MVVM с использованием BooleanToVisibilityConverter

В моем приложении 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"/>
4b9b3361

Ответ 1

Для начала игры, если вы используете команду, тогда вам не нужно связывать IsEnabled, реализация этой команды должна решить это.

Во-вторых, привязка ViewModel к представлению имеет тенденцию происходить на бит более поздней стадии, поэтому лучше также установить значение по умолчанию для привязки, например

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

В-третьих, как указал Майк, убедитесь, что ваше свойство общедоступно, поскольку ViewModel и View представляют собой два отдельных класса.

Ответ 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");
        }
    }

И убедитесь, что для DataContext вашего MainWindow установлено значение ViewModel.