在我的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"/>
答案 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
。