RadNumericUpDown 增量率

RadNumericUpDown Increment Rate

我在 C# Prism MVVM 应用程序中使用 Telerik RadNumericUpDown 控件。当我的用户按住向上或向下箭头时,控件会增加它绑定到的 属性 的值。但是,当 属性 值更改时,命令会通过通信线路发送到另一台设备,但会有一些延迟。此外,在某些情况下,设备无法成功更改此参数的值。

这是我认为的代码。

<telerik:RadNumericUpDown x:Name="VoltageNumericControl" HorizontalAlignment="Left" Margin="165,0,0,0" Grid.RowSpan="1" VerticalAlignment="Center" Grid.Row="2" NumberDecimalDigits="2" Maximum="10.00" Minimum="0.00" SmallChange="0.01" ValueFormat="Numeric"  
Value="{Binding ModelDevice.Voltage, Mode=TwoWay, Delay= 50}"/>

它增加了我的 ViewModel 中的值,例如:

 public double Voltage
 {
     get { return voltage; }
     set
     {
         dataService.SetVoltage(value);   // Triggers command to external device
         SetProperty(ref voltage, value); // Updates local value temporarily
         // Value is then updated an indeterminate period later when a response is 
         // received from the external device 
     }
 }

如何更改 RadNumericUpDown 控件的行为,以便按住按钮或箭头键不会尝试连续更新其绑定到的 属性 的值?

在外部设备请求未决时禁用控件并在您有响应并且知道正确值时再次启用它如何?从 UIElement 派生的每个控件都有一个 属性 IsEnabled,您可以使用它来停用用户输入(控件显示为灰色)。

Gets or sets a value indicating whether this element is enabled in the user interface (UI) [...] Elements that are not enabled do not participate in hit testing or focus and therefore will not be sources of input events.

您可以在视图模型中创建 属性 IsExternalDeviceNotPending。并将其绑定到 RadNumericUpDown 上的 IsEnabled 属性。请注意 ..NotPending(启用意味着 外部设备挂起)。如果你想让它成为一个积极的条件(...Pending),你必须在XAML中使用一个值转换器来取反这个值,所以这更简单。

private bool isExternalDeviceNotPending;
public bool IsExternalDeviceNotPending
{
    get => isExternalDeviceNotPending;
    private set => SetProperty(ref isExternalDeviceNotPending, value);
    }
}
<telerik:RadNumericUpDown x:Name="VoltageNumericControl" IsEnabled="{Binding IsExternalDeviceNotPending}" ... />

现在您可以在 Voltage 设置后将 IsExternalDeviceNotPending 设置为 false,从而启动与外部设备的通信。然后控件将被禁用。

public double Voltage
{
    get { return voltage; }
    set
    {
        IsExternalDeviceNotPending = false;
        dataService.SetVoltage(value);
        SetProperty(ref voltage, value);
    }
}

通信完成后,将其重置为true,以再次启用控件并允许用户输入。