我怎样才能编写类似这样的模板?
<DataTemplate ... TextBlock>
UpdateSourceTrigger=PropertyChanged
</DataTemplate>
您无法在样式中更改UpdateSourceTrigger
的默认模式。当注册依赖属性(在此情况下是Text
属性)时,这被配置为FrameworkPropertyMetadata
类的DefaultUpdateSourceTrigger
。
您可以创建一个自定义文本框类型,该类型派生自TextBox
并在注册依赖属性时更改此值。或者,您可以尝试使用Caliburn.Micro MVVM框架,它会自动为应用程序中的所有文本框设置此值(通过代码,作为其基于约定的绑定的一部分)。
我来扩展一下已经接受的答案(是的,我知道我在挖坟 :)):
实际上,自己的文本框很简单,我们称其为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}}" />