我正在使用Extended WPF工具包,并希望在用户输入内容时更新值( PropertyChanged )
但是,当使用IntegerUpDown(或任何NumericUpDown控件)时,只有在按下回车键时才会更新该值,或者如果按下控件上的向上按钮或控件失去焦点。这是开发人员在此处所说的“按设计”:
http://wpftoolkit.codeplex.com/workitem/16544
“这是设计使然。只有当值增加/减少时,按Enter键或失去焦点时才会更新源。”
将UpdateSourceTrigger设置为任何值(即 PropertyChanged )都没有效果,这个SO线程中也记录了这一点:
DecimalUpDown (Extended WPF toolkit) - Source only gets updated on lost focus
但是当我将它与功能区结合使用时,我遇到了这种行为的严重问题,当它打开时,它实际上并不会触发LostFocus。因此,根据绑定到NumericUpDown的值将任何命令放在功能区中将永远不会按预期工作。
我想在用户打开功能区时自己触发LostFocus事件,但这看起来很丑陋,可能不会一直有效。
我正在寻找这个问题的优雅解决方案,我真的不想下载源代码并进行修改。我要么修改NumericUpDown控件以实际更新 PropertyChanged 上的值(这可以仅使用额外的XAML / Behaviors / Triggers吗?)或者找到一种优雅的方式来随时触发LostFocus事件没有实际破坏用户体验。
有没有人为此找到解决方案?
答案 0 :(得分:0)
我通过覆盖控件的默认模板
解决了这个问题<Style x:Key="EnhancedNumericUpDown" TargetType="Control">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Control">
<ext:ButtonSpinner x:Name="Spinner"
IsTabStop="False"
Background="{TemplateBinding Background}"
BorderThickness="{TemplateBinding BorderThickness}"
AllowSpin="{Binding AllowSpin, RelativeSource={RelativeSource TemplatedParent}}"
ShowButtonSpinner="{Binding ShowButtonSpinner, RelativeSource={RelativeSource TemplatedParent}}">
<ext:WatermarkTextBox x:Name="TextBox"
BorderThickness="0"
Background="Transparent"
ContextMenu="{TemplateBinding ContextMenu}"
FontFamily="{TemplateBinding FontFamily}"
FontSize="{TemplateBinding FontSize}"
FontStretch="{TemplateBinding FontStretch}"
FontStyle="{TemplateBinding FontStyle}"
FontWeight="{TemplateBinding FontWeight}"
Foreground="{TemplateBinding Foreground}"
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
IsReadOnly="{Binding IsReadOnly, RelativeSource={RelativeSource TemplatedParent}}"
MinWidth="20"
AcceptsReturn="False"
Padding="0"
SelectAllOnGotFocus="{Binding SelectAllOnGotFocus, RelativeSource={RelativeSource TemplatedParent}}"
TextAlignment="{Binding TextAlignment, RelativeSource={RelativeSource TemplatedParent}}"
TextWrapping="NoWrap"
TabIndex="{TemplateBinding TabIndex}"
Text="{Binding Text, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}"
VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
Watermark="{Binding Watermark, RelativeSource={RelativeSource TemplatedParent}}"
WatermarkTemplate="{Binding WatermarkTemplate, RelativeSource={RelativeSource TemplatedParent}}" />
</ext:ButtonSpinner>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我更改了Text属性的Template Binding以包含触发器
Text="{Binding Text, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}"