Как выполнить простую условную привязку 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
}