Как я могу написать шаблон, похожий на это?
<DataTemplate ... TextBlock>
UpdateSourceTrigger=PropertyChanged
</DataTemplate>
Как я могу написать шаблон, похожий на это?
<DataTemplate ... TextBlock>
UpdateSourceTrigger=PropertyChanged
</DataTemplate>
Вы не можете изменить режим по умолчанию для UpdateSourceTrigger
в стиле. Он настроен как DefaultUpdateSourceTrigger
класса FrameworkPropertyMetadata
, когда зарегистрирован DependencyProperty
(в данном случае свойство Text
).
Вы можете создать тип пользовательского текстового поля, который происходит от TextBox
и изменяет это значение при регистрации свойства зависимостей. Кроме того, вы можете посмотреть в Caliburn.Micro MVVM framework, который автоматически устанавливает это для всех текстовых полей в приложении (через код, как часть его привязки на основе соглашения).
Просто распространяя принятый ответ (и да, я знаю, что я некроментирую этот вопрос:)):
Собственно, собственный 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}}" />