Свойство данных WPF привязки для отрицания свойства

Есть ли способ изменить значение свойства во время выполнения в привязке данных WPF. Скажем, мой TextBox привязан к свойству IsAdmin. В любом случае я могу изменить это значение свойства в XAML как IsAdmin.

Я просто хочу отрицать свойство, поэтому Valueconverter может быть излишним!

ПРИМЕЧАНИЕ. Без использования ValueConverter

Ответ 1

Вы можете использовать IValueConverter.

[ValueConversion(typeof(bool), typeof(bool))]
public class InvertBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool original = (bool)value;
        return !original;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool original = (bool)value;
        return !original;
    }
}

Затем вы настроили привязку как:

<TextBlock Text="{Binding Path=IsAdmin, Converter={StaticResource boolConvert}}" />

Добавьте ресурс (обычно в свой UserControl/Window), например:

<local:InvertBooleanConverter  x:Key="boolConvert"/>

Изменить в ответ на комментарий:

Если вы хотите избежать конвертации значений по какой-либо причине (хотя я считаю, что это наиболее подходящее место), вы можете сделать преобразование непосредственно в ViewModel. Просто добавьте свойство вроде:

public bool IsRegularUser
{
     get { return !this.IsAdmin; }
}

Если вы это сделаете, убедитесь, что ваш установщик свойств IsAdmin также вызывает событие PropertyChanged для "IsRegularUser", а также "IsAdmin", поэтому пользовательский интерфейс обновляется соответствующим образом.

Ответ 2

Если вы специально хотите сделать это на конце XAML (я не уверен, что причина этого, если у вас нет 100-ти аналогичной операции с отрицанием), существует только два способа: 1) Используя IValueConverter 2) напишите расширение XAML Markup Extension ( Слишком много работы для этой маленькой задачи:))

Тогда другой очевидный способ - написать другое свойство в вашей ViewModel, которое может вернуть Negative свойства IsAdmin.

Ответ 3

Вы можете написать ValueConverter, который автоматически отменяет inpurt перед его возвратом. Посмотрите блог BenCon для краткого чтения конвертеров значений.

Ответ 4

Вы не можете привязываться к свойству!, но вы можете создать новое привязку с соответствующим IValueConverter и изменить всю привязку во время выполнения. Ключ - это класс BindingOperations, который позволяет вам изменить привязку к определенному DependencyProperty.

    public static void InvertBinding(DependencyObject target, DependencyProperty dp)
    {
        //We'll invert the existing binding, so need to find it
        var binding = BindingOperations.GetBinding(target, dp);
        if (binding != null)
        {
            if (binding.Converter != null)
                throw new InvalidOperationException("This binding already has a converter and cannot be inverted");
            binding.Converter = new InvertingValueConverter(); //This would be your custom converter

            //Not sure if you need this step, but it will cause the binding to refresh
            BindingOperations.SetBinding(target, dp, binding);
        }
    }

Это должно дать вам общее представление; Я бы не использовал это для производственного кода, так как вы, вероятно, захотите обобщить его для переключения конвертера или всего остального, что вам нужно изменить во время выполнения. Вы также можете избежать изменения привязки полностью, создав новое свойство, которое вы связываете с тем, которое инкапсулирует эту логику "переключения". Последний вариант, вероятно, лучший.