如何在MVVM中强制更新UI?

汤姆·L

好吧,让我尝试解释一下。

我有一个可以触发某种扫描过程的应用程序。此扫描过程将启动(仅一个数字)10个后台工作人员,他们会做某事。经过(再次,只是一个数字)5秒后,我想

  • 杀死所有后台工作人员(我为此使用CancelAsync)
  • 用我从所有人那里得到的数据做一些计算
  • 更新UI,以便显示数据并启用某些按钮(这些按钮通过名为ViewModelCommand绑定PerformUpdateCommand,它们的CanExecute属性为IsPerformUpdateAllowedIsPerformUpdateAllowed在我的任务完成时设置依赖项属性。

我以为我会做的:

  • 触发后台工作程序后,以5秒的间隔启动调度程序计时器。
  • DispatcherTimer“滴答”出现时,我计算数据并将属性IsPerformUpdateAllowed设置为true或false。

这基本上可以按预期工作(UI保持响应状态,...),只是进行了一些小操作:UI尚未更新(未启用按钮)。一旦将窗口放到背景中并放回前景中,就启用了命令,并且该IsPerformUpdateAllowed属性也设置为true。同样,当我按下按钮后(在禁用状态下),它将被启用。

因此,尽管我正确设置了依赖项属性,但UI对此更改没有反应。

有人知道为什么吗?有趣的是,我还在UI中将一些文本设置为标签-此文本已正确更新。只是告诉命令的属性CanExecute不会触发UI更新。

计时器初始化的代码。

        _scanTimer = new DispatcherTimer();
        _scanTimer.Interval = new TimeSpan(0, 0, 0, 3);
        _scanTimer.Tick += delegate
        {
            // After the timer has elapsed (some time passed), cancel all scans and update the result
            _scanTimer.Stop();
            UpdateScanResults();
            CancelNormalScans(false);
        };
        _scanTimer.Start();

编码命令如何绑定到WPF元素(按钮实际上是一个超链接):

            <Label Grid.Row="1" Grid.Column="1">
                <Hyperlink Command="{Binding ReadSettingsCommand}">
                    <TextBlock Text="{Binding Source={StaticResource Loc}, Path=Labels.ReadSettings}"></TextBlock>
                </Hyperlink>
            </Label>

这是命令的代码

    public RelayCommand ReadSettingsCommand
    {
        get
        {
            return _readSettingsCommand
                ?? (_readSettingsCommand = new RelayCommand(ExecuteReadSettings, () => IsScannedDeviceAvailable && !IsUpdateInProgress));
        }
    }

该代码实际上取决于两个依赖项属性IsScannedDeviceAvailable和NOT IsUpdateInProgress。两者都是依赖项属性。

更新:我刚刚读到与CanExecute属性的绑定只是一次。如果要重新验证,则需要在命令上调用RaiseCanExecuteChanged。这可行,但是有点麻烦,因为现在每次两个属性之一更改时,我都需要手动调用它。实际上,我希望可以自动处理该问题。关于如何更轻松地完成此操作的任何想法?在CanExecute和属性之间没有某种单向绑定的方法吗?

阿龙

只要设置了IsScannedDeviceAvailable / IsUpdateInProgress,就可以在您的VM上调用RaiseCanExecuteChanged。或者我个人最喜欢的还是创建您自己的实现,ICommand因为它非常简单。

public class FooCommand : ICommand
{
    private bool _canExecute;
    private Action _delegate;
    public event EventHandler CanExecuteChanged;
    public new bool CanExecute
    {
        get
        {
            return _canExecute;
        }
        set
        {
            _canExecute = value;
            if(CanExecuteChanged != null)
                CanExecuteChanged();
        }
    }

    public void Execute(object parameter)
    {
        _delegate();
    }

    bool ICommand.CanExecute()
    {
        return CanExecute;
    }

    public FooCommand(Action action)
    {
        _delegate = action;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在MVVM模式中更新模型和查看模型?

来自分类Dev

如何在Polymer中强制进行模板更新?

来自分类Dev

React:如何在功能组件中强制状态更新?

来自分类Dev

如何在UI线程上执行冗长的任务期间强制执行UI更新

来自分类Dev

如何在 MVVM 架构 android 中的云 Firestore 实时更新中包含源缓存

来自分类Dev

如何在SearchDelegate的buildResults中传递更新UI值?

来自分类Dev

如何在UITabbarController中更新默认标志UI外观?

来自分类Dev

如何在MVVMLight RelayCommand方案中更新UI?

来自分类Dev

如何在android中更新我的UI值?

来自分类Dev

在MVVM中,如何防止BackgroundWorker冻结UI?

来自分类Dev

当语音显示为“未学习”时,如何在新UI中强制学习?

来自分类Dev

如何在jQuery UI中强制打开自动完成功能

来自分类Dev

如何在GitHub上的README.rst中强制更新图像(缓存)

来自分类Dev

如何在React代码中强制更新组件以将深色主题切换为浅色主题

来自分类Dev

添加osgi捆绑包时如何在Eclipse中强制目标平台更新

来自分类Dev

如何从 MVVM 中的模型更新 ProgressBar?

来自分类Dev

如何强制Knockout.js更新UI(重新评估绑定)

来自分类Dev

Kendo UI:在TextBox中的KeyPress上强制更新ViewModel

来自分类Dev

如何在MVVM中制作MouseOver事件?

来自分类Dev

如何在Mvvm Light中清理ViewModel?

来自分类Dev

如何在mvvm中重置视图模型

来自分类Dev

CommandParameter如何在MVVM中工作?

来自分类Dev

如何在MVVM中编写ViewModelBase

来自分类Dev

如何在MVVM中制作MouseOver事件?

来自分类Dev

如何在PySide中强制重画?

来自分类Dev

如何在PHP中强制foreach重置

来自分类Dev

如何在ActionFilterAttribute中强制请求失败

来自分类Dev

如何在Symfony中强制注销用户?

来自分类Dev

如何在Grails GORM中强制冲洗

Related 相关文章

  1. 1

    如何在MVVM模式中更新模型和查看模型?

  2. 2

    如何在Polymer中强制进行模板更新?

  3. 3

    React:如何在功能组件中强制状态更新?

  4. 4

    如何在UI线程上执行冗长的任务期间强制执行UI更新

  5. 5

    如何在 MVVM 架构 android 中的云 Firestore 实时更新中包含源缓存

  6. 6

    如何在SearchDelegate的buildResults中传递更新UI值?

  7. 7

    如何在UITabbarController中更新默认标志UI外观?

  8. 8

    如何在MVVMLight RelayCommand方案中更新UI?

  9. 9

    如何在android中更新我的UI值?

  10. 10

    在MVVM中,如何防止BackgroundWorker冻结UI?

  11. 11

    当语音显示为“未学习”时,如何在新UI中强制学习?

  12. 12

    如何在jQuery UI中强制打开自动完成功能

  13. 13

    如何在GitHub上的README.rst中强制更新图像(缓存)

  14. 14

    如何在React代码中强制更新组件以将深色主题切换为浅色主题

  15. 15

    添加osgi捆绑包时如何在Eclipse中强制目标平台更新

  16. 16

    如何从 MVVM 中的模型更新 ProgressBar?

  17. 17

    如何强制Knockout.js更新UI(重新评估绑定)

  18. 18

    Kendo UI:在TextBox中的KeyPress上强制更新ViewModel

  19. 19

    如何在MVVM中制作MouseOver事件?

  20. 20

    如何在Mvvm Light中清理ViewModel?

  21. 21

    如何在mvvm中重置视图模型

  22. 22

    CommandParameter如何在MVVM中工作?

  23. 23

    如何在MVVM中编写ViewModelBase

  24. 24

    如何在MVVM中制作MouseOver事件?

  25. 25

    如何在PySide中强制重画?

  26. 26

    如何在PHP中强制foreach重置

  27. 27

    如何在ActionFilterAttribute中强制请求失败

  28. 28

    如何在Symfony中强制注销用户?

  29. 29

    如何在Grails GORM中强制冲洗

热门标签

归档