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

syn*_*ned 14 .net c# wpf

我怎么写模板看起来像这样?

    <DataTemplate ... TextBlock>
    UpdateSourceTrigger=PropertyChanged
    </DataTemplate>
Run Code Online (Sandbox Code Playgroud)

dev*_*tal 12

您无法更改UpdateSourceTrigger样式中的默认模式.这被配置为DefaultUpdateSourceTrigger所述的FrameworkPropertyMetadata类时DependencyProperty(在这种情况下,Text属性)被注册.

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


Jan*_* K. 6

只是扩展接受的答案(是的,我知道我正在对这个问题进行死灵术:)):

其实,自己的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),
                                      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 });
    }

  }
Run Code Online (Sandbox Code Playgroud)

以及 {ResourceDictionary}.xaml 或 App.xaml 中的某个位置:

<Style TargetType="{x:Type control:TextBoxExt}"
       BasedOn="{StaticResource {x:Type TextBox}}" />
Run Code Online (Sandbox Code Playgroud)