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

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

2 голосов
/ 05 июня 2013

Да, необходимо заменить шаблон элемента управления на шаблон с 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}"
2 голосов
/ 02 марта 2016

Я тоже потратил некоторое время на эту проблему и нашел довольно хорошее решение, я отредактировал шаблон (щелкните правой кнопкой мыши на 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}" />
1 голос
/ 27 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...