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

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

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

Примечание: Не используя ValueConverter

27
задан Dave Clemmer 5 August 2011 в 18:52
поделиться

4 ответа

Вы можете использовать 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», поэтому пользовательский интерфейс обновляется соответствующим образом.

42
ответ дан 28 November 2019 в 05:19
поделиться

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

0
ответ дан 28 November 2019 в 05:19
поделиться

Вы не можете выполнить привязку к свойству!, Но вы можете создать новую привязку с соответствующим 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
ответ дан 28 November 2019 в 05:19
поделиться

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

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

2
ответ дан 28 November 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: