2

我正在开发一个高性能的 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,如果没有选中该框,一切都会很好。由于某种原因,此代码不起作用。

4

1 回答 1

3

我的想法是在方法调用中短路,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);
}
于 2012-05-07T02:07:16.273 回答