Как выполнить простую условную привязку XAML (WPF) для свойства Visibility
у меня есть модель представления со свойством:
public class MyModel
{
public bool IsEnabled {get;set;}
}
Я хочу использовать это свойство для переключения состояния кнопки. Если логическое значение true, я хочу скрыть кнопку и в противном случае показать ее.
Я пробовал такие вещи, как:
<Button Visibility= "{Binding IsEnabled ? Hidden : Visible }">Enable</Button>
но это не подходит.
я попробовал более сложное решение, но я предполагаю, что мне не хватает чего-то тривиального.
какие предложения?
3 ответов
так как вы хотите, чтобы переключаться между Hidden
и Visible
и true скрыт вы можете либо написать custom IValueConverter
или использовать простой Style.Trigger
<Button Content="Enable">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="Visibility" Value="Visible"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsEnabled}" Value="True">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
это все при условии DataContext
устанавливается соответственно и MyModel.IsEnabled
поднимает INotifyPropertyChanged.PropertyChanged
событие при каждом изменении
public class MyModel : INotifyPropertyChanged
{
private bool _isEnabled;
public bool IsEnabled
{
get { return _isEnabled; }
set
{
_isEnabled = value;
OnPropertyChanged("IsEnabled");
}
}
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
используйте BooleanToVisibilityConverter:
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</Window.Resources>
<Button Visibility= "{Binding IsEnabled, Converter={StaticResource BooleanToVisibilityConverter}}" />
добавить класс, наследующий IValueConverter
public class BooleanToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
bool bValue = (bool)value;
if (bValue)
return Visibility.Visible;
else
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Visibility visibility = (Visibility)value;
if (visibility == Visibility.Visible)
return true;
else
return false;
}
#endregion
}