按钮isEnabled属性在WPF MVVM中没有鼠标单击时无法正常工作

3

我有一个基于MVVM模式的WPF应用程序。

我遇到了一个非常烦人的问题,但是我无法想出如何解决它。

我的应用程序是向导应用程序。当用户按下“下一步”按钮时,我会在另一个线程(后台工作器)中开始一些进度。当bgWorker启动时,他会设置CanMoveNext = false,这个属性绑定到下一步按钮的isEnabled属性上。当bgworker完成时,他会将CanMoveNext设置回true;

CanMoveNext得到IsEnabled = false时,UI立即显示它,但是当isEnabled属性重新设置为true时,UI只有在鼠标点击或键盘按键之后才刷新。

在我改变属性之后,我使用OnPropertyChanged()方法,我甚至尝试使用CommandManager.InvalidateRequerySuggested();,但仍然没有在没有鼠标单击的情况下刷新。

我该如何解决这个问题?

以下是我的代码:

       public override bool CanMoveNext
        {
            get
            {
                return canMoveNext;
            }
            set
            {
                canMoveNext = value;
                OnPropertyChanged("CanMoveNext");
            }
        }



    public void StartProgress()
            {

                CanMoveNext = false;
                InitBGworkers(out bgStartPersonalWorker);
    bgStartPersonalWorker.RunWorkerAsync();
    }



        void bgStartPersonalWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            DoStuff();
        }



        void bgStartPersonalWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
                {
     CanMoveNext = true;
//Even  CommandManager.InvalidateRequerySuggested(); doen`t help
                }

//XAML中的代码

<Button Content="{Binding ButtonNextCaption}" IsEnabled="{Binding CanMoveNext, UpdateSourceTrigger=PropertyChanged}" Command="{Binding Path=NavigateNextCommand}" Margin="5,0,5,0" Width="100" Height="40" FontSize="14" FontWeight="Bold"/>

谢谢


只是一个大胆的猜测,但是您是否尝试从 UI 线程设置该属性?例如,使用 Dispatcher.Invoke 设置 CanMoveNext? - Blachshma
好的,我想通了 - 你的评论帮助我找到了解决方案。 - Ofir
1个回答

1
我找到了解决方法:
            Application.Current.Dispatcher.BeginInvoke(new ThreadStart(() =>
            {
                CommandManager.InvalidateRequerySuggested();

            }));

使用方法组: Application.Current.Dispatcher.BeginInvoke(new ThreadStart(CommandManager.InvalidateRequerySuggested)); - Eric Bole-Feysot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接