有没有办法全局更改wpf中绑定的默认行为?

时间:2010-11-02 10:50:32

标签: c# wpf binding .net-4.0 updatesourcetrigger

有没有办法更改绑定的默认行为,所以我不需要在每个文件框中设置'UpdateSourceTrigger = PropertyChanged'?

这可以通过ControlTemplate或Style吗?

完成

3 个答案:

答案 0 :(得分:7)

也许它更适合覆盖Bindings的默认值,你可以将它用于此目的:

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

然后定义一些CustomBinding类(在构造函数中设置适当的默认值)和MarkupExtension'CustomBindingExtension'。 然后用以下内容替换XAML中的绑定:

  

Text =“{CustomBinding Path = Xy ...}”

我已经成功尝试了类似的绑定,为ValidatesOnDataError和NotifyOnValidationError设置了某些默认值,也适用于你的情况。 问题是你是否愿意更换所有绑定,但你可以自动完成这项任务。

答案 1 :(得分:1)

否。此行为由DefaultUpdateSourceTrigger类的FrameworkPropertyMetadata处理,该类在注册DependencyProperty时传递。可以在继承的TextBox类和每个绑定中覆盖它,但不能覆盖应用程序中的每个TextBox

答案 2 :(得分:-1)

像Pieter提议的那样,我用这样的继承类解决了它:

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;
        }

有任何建议如何更好地解决它?