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

Я использую элемент управления DecimalUpDown расширенного набора инструментов WPF со свойством Value, привязанным к десятичному числу? следующее:

   <extToolkit:DecimalUpDown Value="{Binding BlahBlah, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ShowButtonSpinner="False" />

private Decimal? blahblah = 5;
    public Decimal? BlahBlah
    {
        get { return blahblah; }
        set { blahblah = value; }
    }

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

Я намерен обновить значение, как только пользователь изменит значение (то есть в режиме реального времени). Есть ли способ сделать это?

3 ответа

Решение

Я подозреваю, что ваш параметр привязки "теряется" в переходах значений. NumericUpDown контролирует внутренне связать WatermarkTextBox к Text собственность через TemplateBindingЧтобы элемент управления уважал ваш UpdateSourceTrigger, его, вероятно, нужно будет применить на этом уровне. Так что из-за этого промежуточного связывания и не немедленной синхронизации между Value а также Text Вы не можете контролировать поведение источника обновления.

Да, вы должны заменить шаблон элемента управления на шаблон с UpdateSourceTrigger=PropertyChanged. Я сделал это в прошлом году, скопировав существующий шаблон, внеся изменения, и затем использовал его в своем контроле. Новый ресурс:

        <ControlTemplate x:Key="newDecimalUpDownTemplate" 
                     TargetType="{x:Type Control}">
        <extToolkit:ButtonSpinner x:Name="Spinner" 
                                  AllowSpin="{Binding AllowSpin, RelativeSource={RelativeSource TemplatedParent}}" 
                                  BorderThickness="{TemplateBinding BorderThickness}" 
                                  Background="{TemplateBinding Background}" 
                                  IsTabStop="False" 
                                  ShowButtonSpinner="{Binding ShowButtonSpinner, RelativeSource={RelativeSource TemplatedParent}}">
            <extToolkit:WatermarkTextBox x:Name="TextBox" 
                                         AcceptsReturn="False" 
                                         BorderThickness="0" 
                                         Background="{TemplateBinding Background}" 
                                         ContextMenu="{TemplateBinding ContextMenu}" 
                                         Foreground="{TemplateBinding Foreground}" 
                                         FontWeight="{TemplateBinding FontWeight}" 
                                         FontStyle="{TemplateBinding FontStyle}" 
                                         FontStretch="{TemplateBinding FontStretch}" 
                                         FontSize="{TemplateBinding FontSize}" 
                                         FontFamily="{TemplateBinding FontFamily}" 
                                         HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                         MinWidth="20" 
                                         SelectAllOnGotFocus="{Binding SelectAllOnGotFocus, RelativeSource={RelativeSource TemplatedParent}}" 
                                         TextAlignment="{Binding TextAlignment, RelativeSource={RelativeSource TemplatedParent}}" 
                                         TextWrapping="NoWrap" 
                                         Text="{Binding Text, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}" 
                                         TabIndex="{TemplateBinding TabIndex}" 
                                         VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" 
                                         WatermarkTemplate="{Binding WatermarkTemplate, RelativeSource={RelativeSource TemplatedParent}}" 
                                         Watermark="{Binding Watermark, RelativeSource={RelativeSource TemplatedParent}}">
                <extToolkit:WatermarkTextBox.IsReadOnly>
                    <Binding Path="IsEditable" RelativeSource="{RelativeSource TemplatedParent}">
                        <Binding.Converter>
                            <Converters:InverseBoolConverter/>
                        </Binding.Converter>
                    </Binding>
                </extToolkit:WatermarkTextBox.IsReadOnly>
            </extToolkit:WatermarkTextBox>
        </extToolkit:ButtonSpinner>
    </ControlTemplate>

В моем контроле:

 Template="{StaticResource newDecimalUpDownTemplate}"

Я сам также потратил некоторое время на эту проблему и нашел довольно хорошее решение, я отредактировал шаблон (щелкните правой кнопкой мыши на DecimalUpDown и перейдите к редактированию шаблона Edit Template, спасибо, Бен, вы сэкономили мне серьезное время -> Как переписать стиль) и объединил это с блестящим решением emorog!

Я написал все это в стиле:

<Style x:Key="DecimalUpDownStyle1" TargetType="{x:Type xctk:DecimalUpDown}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type xctk:DecimalUpDown}">
                    <xctk:ButtonSpinner x:Name="PART_Spinner" AllowSpin="{Binding AllowSpin, RelativeSource={RelativeSource TemplatedParent}}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" ButtonSpinnerLocation="{Binding ButtonSpinnerLocation, RelativeSource={RelativeSource TemplatedParent}}" Background="{TemplateBinding Background}" HorizontalContentAlignment="Stretch" IsTabStop="False" ShowButtonSpinner="{Binding ShowButtonSpinner, RelativeSource={RelativeSource TemplatedParent}}" VerticalContentAlignment="Stretch">
                        <xctk:WatermarkTextBox x:Name="PART_TextBox" Text="{Binding Text, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}" AutoMoveFocus="{Binding AutoMoveFocus, RelativeSource={RelativeSource TemplatedParent}}" AutoSelectBehavior="{Binding AutoSelectBehavior, RelativeSource={RelativeSource TemplatedParent}}" AcceptsReturn="False" BorderThickness="0" Background="Transparent" ContextMenu="{TemplateBinding ContextMenu}" Foreground="{TemplateBinding Foreground}" FontWeight="{TemplateBinding FontWeight}" FontStyle="{TemplateBinding FontStyle}" FontStretch="{TemplateBinding FontStretch}" FontSize="{TemplateBinding FontSize}" FontFamily="{TemplateBinding FontFamily}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" IsTabStop="{TemplateBinding IsTabStop}" IsUndoEnabled="True" MinWidth="20" Padding="{TemplateBinding Padding}" SelectAllOnGotFocus="{Binding SelectAllOnGotFocus, RelativeSource={RelativeSource TemplatedParent}}" TextAlignment="{Binding TextAlignment, RelativeSource={RelativeSource TemplatedParent}}" TextWrapping="NoWrap" TabIndex="{TemplateBinding TabIndex}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" WatermarkTemplate="{Binding WatermarkTemplate, RelativeSource={RelativeSource TemplatedParent}}" Watermark="{Binding Watermark, RelativeSource={RelativeSource TemplatedParent}}"/>
                    </xctk:ButtonSpinner>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

и могу использовать это так:

<xctk:DecimalUpDown Style="{StaticResource DecimalUpDownStyle1}" Value="{Binding DisplayValue, UpdateSourceTrigger=PropertyChanged}" />
Другие вопросы по тегам