Ribbon LostFocus + NumericUpDown问题

时间:2012-03-16 11:49:18

标签: c# wpf ribboncontrolslibrary

我正在使用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事件没有实际破坏用户体验。

有没有人为此找到解决方案?

1 个答案:

答案 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}"