Есть ли любой способ изменить значение свойства во времени выполнения в привязке данных WPF. Скажем, мой TextBox, связывают со свойством IsAdmin. Есть ли так или иначе, я могу изменить то значение свойства в XAML, чтобы быть! IsAdmin.
Я просто хочу инвертировать свойство, таким образом, Valueconverter мог бы быть излишеством!
Примечание: Не используя ValueConverter
Вы можете использовать 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», поэтому пользовательский интерфейс обновляется соответствующим образом.
Вы можете написать ValueConverter, который автоматически отменяет ввод перед его возвратом. Взгляните на блог BenCon , чтобы получить краткую информацию о преобразователях стоимости.
Вы не можете выполнить привязку к свойству!, Но вы можете создать новую привязку с соответствующим 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);
}
}
Это должно дать вам общее представление; Я бы не стал использовать это для производственного кода, так как вы, вероятно, захотите обобщить его, чтобы переключить конвертер или что-то еще, что вам нужно изменить во время выполнения. Вы также можете полностью избежать изменения привязки, создав новое свойство, которое вы привязываете, которое инкапсулирует эту логику «переключения». Последний вариант, наверное, лучший.
Если вы конкретно хотите сделать это на конце XAML (я не уверен, в чем причина, если только у вас нет сотен аналогичных операций отрицания), есть только два способа: 1) Использование IValueConverter 2) написать расширение разметки XAML ( Слишком много работы для этой небольшой задачи :))
Другой очевидный способ - написать другое свойство в вашей ViewModel, которое может вернуть Negative свойства IsAdmin.