Привязка данных свойства WPF для отрицания свойства - PullRequest
27 голосов
/ 05 апреля 2010

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

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

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

Ответы [ 4 ]

42 голосов
/ 05 апреля 2010

Вы можете использовать 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"/>

Редактировать в ответ на комментарий:

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

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

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

2 голосов
/ 05 апреля 2010

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

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

0 голосов
/ 05 апреля 2010

Невозможно выполнить привязку к! Property, но вы можете создать новую привязку с соответствующим 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);
        }
    }

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

0 голосов
/ 05 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...