2010-04-05 10 views
20

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

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

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

ответ

32

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

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

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

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

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

+0

На самом деле я должен был упомянуть, не используя ValueConverter – azamsharp

+6

Не думаете ли вы, что waaaaay много работает для простой операции отрицания! – azamsharp

+8

@azamsharp: Я отредактировал, чтобы дать вам еще один вариант - но нет, не знаю, в основном потому, что это ** многоразовый код **. После создания конвертера вы можете использовать его для ВСЕХ ваших конверсий! Bool, где бы вы ни находились в своей кодовой базе. –

0

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

2

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

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

0

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

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

Смежные вопросы