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}" />