把UpdateSourceTrigger属性设置为PropertyChanged应用到所有WPF文本框

15

我怎样才能编写类似这样的模板?

    <DataTemplate ... TextBlock>
    UpdateSourceTrigger=PropertyChanged
    </DataTemplate>
2个回答

14

您无法在样式中更改UpdateSourceTrigger的默认模式。当注册依赖属性(在此情况下是Text属性)时,这被配置为FrameworkPropertyMetadata类的DefaultUpdateSourceTrigger

您可以创建一个自定义文本框类型,该类型派生自TextBox并在注册依赖属性时更改此值。或者,您可以尝试使用Caliburn.Micro MVVM框架,它会自动为应用程序中的所有文本框设置此值(通过代码,作为其基于约定的绑定的一部分)。


你有考虑过使用MVVM框架吗?它可以为你节省大量的工作,而且使用Caliburn.Micro进行绑定非常方便。如果你想要自己编写解决方案,那么可能可以编写自定义标记扩展或自定义绑定,而不是创建自己的TextBox派生类型。可以参考http://www.paulstovell.com/wpf-delaybinding或http://www.hardcodet.net/2008/04/wpf-custom-binding-class获取一些想法。 - devdigital
该项目已经迁移到 GitHub 上进行 v2.0 版本的开发。 https://github.com/Caliburn-Micro - Tony

6

我来扩展一下已经接受的答案(是的,我知道我在挖坟 :)):

实际上,自己的文本框很简单,我们称其为TextBoxExt(不是太扩展,但你懂的...)

public class TextBoxExt : TextBox
{
    private static readonly MethodInfo onTextPropertyChangedMethod 
      = typeof(TextBox).GetMethod("OnTextPropertyChanged", BindingFlags.Static | BindingFlags.NonPublic);
    private static readonly MethodInfo coerceTextMethod 
      = typeof(TextBox).GetMethod("CoerceText", BindingFlags.Static | BindingFlags.NonPublic);
    static TextBoxExt()
    {
      
      TextProperty.OverrideMetadata(
        typeof(TextBoxExt),

        // found this metadata with reflector:
        new FrameworkPropertyMetadata(string.Empty,
                                      FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.Journal,
                                      new PropertyChangedCallback(MyOnTextPropertyChanged),
                                      new CoerceValueCallback(MyCoerceText),
                                      true, // IsAnimationProhibited
                                      UpdateSourceTrigger.PropertyChanged)
        );
    }

    private static object MyCoerceText(DependencyObject d, object basevalue)
    {
      return coerceTextMethod.Invoke(null, new object[] { d, basevalue });
    }

    private static void MyOnTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
      onTextPropertyChangedMethod.Invoke(null, new object[] { d, e });
    }

  }

在你的{ResourceDictionary}.xaml或App.xaml中的某个位置:

<Style TargetType="{x:Type control:TextBoxExt}"
       BasedOn="{StaticResource {x:Type TextBox}}" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接