Вопрос:

Есть ли способ глобально изменить поведение привязок по умолчанию в wpf?

c# wpf binding .net-4.0 updatesourcetrigger

1438 просмотра

3 ответа

440 Репутация автора

Есть ли способ изменить поведение привязок по умолчанию, поэтому мне не нужно устанавливать UpdateSourceTrigger = PropertyChanged для каждого, в моем случае, текстового поля?

Может ли это быть сделано с помощью ControlTemplate или Style?

Автор: Cinaird Источник Размещён: 02.11.2010 10:50

Ответы (3)


1 плюс

25568 Репутация автора

Нет . Такое поведение обрабатывается DefaultUpdateSourceTriggerв FrameworkPropertyMetadataклассе, который передается при регистрации DependencyProperty. Это можно переопределить в унаследованном классе TextBoxи для каждой привязки, но не для каждого TextBoxв приложении.

Автор: Pieter van Ginkel Размещён: 02.11.2010 07:15

-1 плюса

440 Репутация автора

Как и предположил Питер, я решил это с помощью унаследованного класса:

public class ActiveTextBox:TextBox
    {
        public ActiveTextBox()
        {
            Loaded += ActiveTextBox_Loaded;
        }

        void ActiveTextBox_Loaded(object sender, System.Windows.RoutedEventArgs e)
        {
            Binding myBinding = BindingOperations.GetBinding(this, TextProperty);
            if (myBinding != null && myBinding.UpdateSourceTrigger != UpdateSourceTrigger.PropertyChanged)
            {
                Binding bind = (Binding) Allkort3.Common.Extensions.Extensions.CloneProperties(myBinding);
                bind.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
                BindingOperations.SetBinding(this, TextBox.TextProperty, bind);
            }
        }
    }

и этот метод помощи:

public static object CloneProperties(object o)
        {
            var type = o.GetType();
            var clone = Activator.CreateInstance(type);
            foreach (var property in type.GetProperties())
            {
                if (property.GetSetMethod() != null && property.GetValue(o, null) != null)
                    property.SetValue(clone, property.GetValue(o, null), null);
            }
            return clone;
        }

Любое предложение, как решить это лучше?

Автор: Cinaird Размещён: 03.11.2010 09:22

7 плюса

3776 Репутация автора

Решение

Может быть, лучше переопределить значения по умолчанию для ваших привязок, вы можете использовать это для этой цели:

http://www.hardcodet.net/2008/04/wpf-custom-binding-class

Затем вы определяете некоторый класс CustomBinding (устанавливая соответствующие значения по умолчанию в конструкторе) и MarkupExtension 'CustomBindingExtension'. Затем замените привязки в вашем XAML чем-то вроде этого:

Text = "{CustomBinding Path = Xy ...}"

Я успешно попробовал нечто подобное с привязкой, которая устанавливает определенные значения по умолчанию для ValidatesOnDataError и NotifyOnValidationError, должна работать и в вашем случае. Вопрос в том, можете ли вы заменить все свои привязки, но вы можете автоматизировать эту задачу.

Автор: Simon D. Размещён: 25.08.2011 08:23
Вопросы из категории :
32x32