9

有没有办法改变绑定的默认行为,所以我不需要在每个文本框上设置“UpdateSourceTrigger=PropertyChanged”?

这可以通过 ControlTemplate 或 Style 完成吗?

4

3 回答 3

7

也许它更适合覆盖您的绑定的默认值,您可以为此目的使用这个:

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

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

文本="{自定义绑定路径=Xy...}"

我已经成功地尝试了类似的绑定,该绑定为 ValidatesOnDataError 和 NotifyOnValidationError 设置了某些默认值,也应该适用于您的情况。问题是您是否愿意替换所有绑定,但您可以自动执行此任务。

于 2011-08-25T08:23:00.890 回答
1

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

于 2010-11-02T19:15:46.397 回答
0

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

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

于 2010-11-03T09:22:44.377 回答