Кнопка скрытия 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"/>
Ответы
Ответ 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
.