我怎么写模板看起来像这样?
<DataTemplate ... TextBlock>
UpdateSourceTrigger=PropertyChanged
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
dev*_*tal 12
您无法更改UpdateSourceTrigger样式中的默认模式.这被配置为DefaultUpdateSourceTrigger所述的FrameworkPropertyMetadata类时DependencyProperty(在这种情况下,Text属性)被注册.
您可以创建自定义文本框类型,该类型TextBox在注册依赖项属性时派生自并更改此值.或者,您可能希望查看Caliburn.Micro MVVM框架,该框架会自动为应用程序中的所有文本框设置此框架(通过代码,作为其基于约定的绑定的一部分).
只是扩展接受的答案(是的,我知道我正在对这个问题进行死灵术:)):
其实,自己的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)