C# 如何在WPF中暂停绑定的UI更新?

C# 如何在WPF中暂停绑定的UI更新?,c#,wpf,binding,viewmodel,C#,Wpf,Binding,Viewmodel,我正在做一个高性能的21点程序。该应用程序主要用于显示,但有时出于性能原因,我想禁用所有界面更新。当我更新UI(自动100%绑定)时,我可以每秒处理约600张卡,在不更新表格和控件的情况下,我可以每秒处理22000多张卡 我在玩弄禁用UI更新的简单方法。我找到的唯一方法是将BlackJackTable UserControls的DataContext设置为空白表ViewModel的DataContext,并允许真实的表ViewModel执行所有计算。如果我想再次观察发生了什么,那么在将DataC

我正在做一个高性能的21点程序。该应用程序主要用于显示,但有时出于性能原因,我想禁用所有界面更新。当我更新UI(自动100%绑定)时,我可以每秒处理约600张卡,在不更新表格和控件的情况下,我可以每秒处理22000多张卡

我在玩弄禁用UI更新的简单方法。我找到的唯一方法是将BlackJackTable UserControls的DataContext设置为空白表ViewModel的DataContext,并允许真实的表ViewModel执行所有计算。如果我想再次观察发生了什么,那么在将DataContext设置回真实的表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中提取。我正在打电话给PropertyChanged,如果这个框没有被选中,一切都会很好。由于某些原因,此代码不起作用。

我的想法是在
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%)仍然意味着22000卡/秒和21500卡/秒之间的差异。就算这没什么大不了的,如果没有更优雅的解决方案,我可能会在这里结束。谢谢你的意见!我认为开销很小,远低于1%。我预计这可能会给物业变更增加1ns。你不太可能编写一个程序,让它发挥作用。我现在就来实现它,如果一切顺利,没有其他答案,我会把它标记为已接受的答案!再次感谢阿拉斯泰尔和盖布。