Применить UpdateSourceTrigger = PropertyChanged ко всем текстовым полям wpf

Как я могу написать шаблон, похожий на это?

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

Ответ 1

Вы не можете изменить режим по умолчанию для UpdateSourceTrigger в стиле. Он настроен как DefaultUpdateSourceTrigger класса FrameworkPropertyMetadata, когда зарегистрирован DependencyProperty (в данном случае свойство Text).

Вы можете создать тип пользовательского текстового поля, который происходит от TextBox и изменяет это значение при регистрации свойства зависимостей. Кроме того, вы можете посмотреть в Caliburn.Micro MVVM framework, который автоматически устанавливает это для всех текстовых полей в приложении (через код, как часть его привязки на основе соглашения).

Ответ 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}}" />