【问题标题】:How To Suspend UI Updates from Bindings in WPF?如何暂停 WPF 中绑定的 UI 更新?
【发布时间】:2012-05-07 01:53:53
【问题描述】:

我正在开发一个高性能的 BlackJack 程序。该应用程序主要用于展示,但有时出于性能原因我想禁用所有界面更新。当我更新 UI 时(自动 100% 绑定),我每秒可以发约 600 张牌,而无需更新表格和控件,我每秒可以发 22,000 多张牌。

我正在尝试禁用 UI 更新的简单方法。我发现的唯一方法是将我的 BlackJackTable UserControls 的 DataContext 设置为空白表 ViewModel 并允许真实表 ViewModel 执行所有计算。如果我想再次查看发生了什么,这会在将 DataContexts 设置回真实表 ViewModel 时产生问题。

所以,总而言之...有没有一种简单的方法可以暂停对象上的所有绑定?删除可见性和禁用 (IsEnabled = false) 对性能没有帮助。有什么建议可以正确地做到这一点吗?

您不需要阅读以下内容,但如果您好奇(或有解决方案),这就是我一直在做的事情:

private void FastModeChk_Checked(object sender, RoutedEventArgs e) {
        if (TableViewModel.GameStatisticsVM.CardsDealt > 0) {
        BlackJackTable.DataContext = BlankTVM;
        DealerControlsTabItem.DataContext = BlankTVM;
        PlayerControlsTabItem.DataContext = BlankTVM.CurrentPlayerHandVM;
        DebugLogTabItem.DataContext = BlankTVM.LoggingVM;
    }
}
private void FastModeChk_Unchecked(object sender, RoutedEventArgs e) {
    BlackJackTable.DataContext = TableViewModel;
    DealerControlsTabItem.DataContext = TableViewModel;
    PlayerControlsTabItem.DataContext = TableViewModel.CurrentPlayerHandVM;
    DebugLogTabItem.DataContext = TableViewModel.LoggingVM;
}

PlayerControlsTabItem 不会一直从 CurrentPlayerHandVM 拉取。我正在调用 OnPropertyChanged,如果没有选中该框,一切都会很好。此代码由于某种原因不起作用。

【问题讨论】:

    标签: c# wpf binding viewmodel


    【解决方案1】:

    我的想法是在RaisePropertyChanged()方法调用中短路,这样PropertyChanged事件就不会被调用。

    类似:

    private int _myInt;
    public int MyInt
    {
        get { return _myInt; } 
        set
        {
            if(_myInt == value)
                return;
    
            _myInt = value;
            RaisePropertyChanged("MyInt");
        }
    }
    
    private void RaisePropertyChanged(string propertyName)
    {
        //if the fastmode is checked, do not allow the PropertyChanged event to be fired.
        if(FastModeChk.Checked)
            return;
    
        var handler = PropertyChanged;
        if(handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName);
    }
    

    【讨论】:

    • 我也想过这个问题。我确信开销会很小,但开销很小(小至 1%)仍然可能意味着 22,000 卡/秒和 21,500 卡/秒之间的差异。诚然这没什么大不了的,如果没有更优雅的解决方案,我可能会在这里结束。感谢您的意见!
    • 我认为开销很小,远低于 1%。
    • 我希望这可能会为属性更改添加 1ns。您不太可能编写一个会有所作为的程序。
    • 我现在就实现这个,如果一切顺利并且没有其他答案,我会将此标记为已接受的答案!再次感谢 Alastair 和 Gabe。
    猜你喜欢
    • 2014-10-14
    • 2013-05-13
    • 1970-01-01
    • 2011-12-06
    • 2011-03-31
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多