WPF RadBusyIndi cator使用MVVM命令模式不触发

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF RadBusyIndi cator使用MVVM命令模式不触发相关的知识,希望对你有一定的参考价值。

我试图在后端进程完成时显示RadBusyIndi​​cator。我有一个绑定到命令的按钮:

XAML

<telerik:RadBusyIndicator x:Name="BusyIndicator" IsBusy="{Binding IsProcessing, Mode=TwoWay}">
     <!-- Form to fill -->
     <Button Name="BtnDoSomething" Content="Do Something" Command="{Binding DoSomethingCommand}" />
</telerik:RadBusyIndicator>

视图模型

public class SomethingViewModel
{
    private readonly DoSomethingService _doSomethingService;

    public SomethingViewModel() 
    {
        _doSomethingService = new DoSomethingService();
        CloseCuCommand = new Command(x => HandleCloseCuCommand());
    }

    private bool _isProcessing;
    public bool IsProcessing
    {
        get { return _isProcessing; }
        set
        {
            _isProcessing = value;
            OnPropertyChanged(nameof(IsProcessing));
        }
    }

    public ICommand DoSomethingCommand{ get; private set; }
    private void HandleDoSomethingCommand()
    {
        IsProcessing = true;
        _doSomethingService.LongProcess()
        IsProcessing = false;
    }
 }

如您所见,我将BusyIndi​​cator绑定到ViewModel上的布尔值。我已经确认OnPropertyChanged正在被点击,但它实际上并没有更新XAML页面上的值。

据我所知,这与WPF的单线程特性有关。但是,我还没有找到一种方法来对像这样绑定的Command进行线程化。我已经尝试将线程逻辑添加到CodeBehind但我仍然无法在Command端处理调度程序。

答案

通过BeginInvoke方法在您需要的位置设置IsProcessing,因为它们位于不同的线程中。

Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
 new Action(() =>
 {
 IsProcessing= true;
 })
 );

以上是关于WPF RadBusyIndi cator使用MVVM命令模式不触发的主要内容,如果未能解决你的问题,请参考以下文章

如何强制 BusyIndi​​cator?

类型工具包:BusyIndi​​cator 未找到

WPF MVVM 数据绑定问题

如何将WPFtoolkit busyindicator用于WPF应用程序

使用 CAShapeLayer 创建 UIActivityIndi​​cator 动画

Silverlight BusyIndi​​cator 内容禁用