Проблемы с лентой LostFocus + NumericUpDown

Я использую расширенный инструментарий 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 ответ

Решение

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

<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}"
Другие вопросы по тегам