将UpdateSourceTrigger = PropertyChanged应用于所有文本框wpf

时间:2012-02-10 11:17:38

标签: c# .net wpf

如何编写模板看起来像这样?

    <DataTemplate ... TextBlock>
    UpdateSourceTrigger=PropertyChanged
    </DataTemplate>

2 个答案:

答案 0 :(得分:11)

您无法更改样式中UpdateSourceTrigger的默认模式。当DefaultUpdateSourceTrigger(在本例中为FrameworkPropertyMetadata属性)已注册时,此配置为DependencyProperty类的Text

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

答案 1 :(得分:2)

只是扩展接受的答案(是的,我知道我正在解决这个问题:)):

实际上,自己的TextBox非常简单,我们称之为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),callback
                                      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}}" />