如何编写模板看起来像这样?
<DataTemplate ... TextBlock>
UpdateSourceTrigger=PropertyChanged
</DataTemplate>
答案 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}}" />