Проблемы с лентой LostFocus + NumericUpDown - PullRequest
0 голосов
/ 16 марта 2012

Я использую расширенный инструментарий WPF и хотел бы обновлять значения всякий раз, когда пользователь вводит что-то в ( PropertyChanged )

Однако, при использовании IntegerUpDown (или любого элемента управления NumericUpDown в этом отношении) значение будет обновляться только при нажатии клавиши ввода или при нажатии кнопок вверх или вниз на элементе управления ИЛИ элемент управления теряет фокус. Это было "разработано" как заявлено разработчиком здесь:

http://wpftoolkit.codeplex.com/workitem/16544

"Это сделано специально. Источник будет обновляться только при увеличении / уменьшении значения, нажатии клавиши Enter или потере фокуса."

Установка UpdateSourceTrigger в любое значение (например, PropertyChanged ) не имеет никакого эффекта, что также было задокументировано в этом потоке SO:

DecimalUpDown (расширенный набор инструментов WPF) - источник обновляется только при потере фокуса

Однако у меня возникают серьезные проблемы с этим поведением при использовании его в сочетании с лентой, которая каким-то образом фактически не запускает LostFocus при его открытии. Поэтому размещение любой команды на ленте в зависимости от значения, связанного с NumericUpDown, никогда не будет работать должным образом.

Я думал о том, чтобы инициировать событие LostFocus самостоятельно, когда пользователь открывает ленту, но это кажется уродливым и, вероятно, будет работать не всегда.

Я ищу элегантное решение этой проблемы, я бы действительно не хотел загружать исходный код и изменять его. Я либо хочу изменить элемент управления NumericUpDown для фактического обновления значения PropertyChanged (это можно сделать, используя только дополнительные XAML / Behaviors / Triggers?), Либо найти элегантный способ вызвать событие LostFocus всякий раз, когда я хочу на самом деле не разрушая пользовательский опыт.

Кто-нибудь нашел решение для этого?

1 Ответ

0 голосов
/ 16 марта 2012

Я решил эту проблему, переопределив шаблон элемента управления по умолчанию

<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, чтобы включить триггер

  Text="{Binding Text, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}"
...