首页 文章

如何处理wpf prism视图模型对象

提问于
浏览
0

我有一个倒计时视图模型,构造函数有一个while循环 .

public class CountDownTimerViewModel : ViewModelBase
{        
    private int duringTime = 100;

    public CountDownTimerViewModel(IEventAggregator eventAggregator)
    {
        Task.Run(async () =>
        {
            while (0 < duringTime)
            {
                await Task.Delay(TimeSpan.FromSeconds(1));

                DuringTime--;

                if (DuringTime == 0)
                    eventAggregator.GetEvent<CountdownComplateEvent>().Publish();
            }
        });
    }
}

我在视图页面数据上下文中使用它 .

public partial class CountDownTimerView : UserControl
{
    public CountDownTimerView(IUnityContainer containerRegistry)
    {
        InitializeComponent();

        Loaded += (o, s) => { DataContext = containerRegistry.Resolve <CountDownTimerViewModel>(); };
    }
}

但是,当我从这个区域删除视图时,如下所示:

private void Action(bool state)
    {
        Application.Current.Dispatcher.Invoke(() =>
        {
            var region = regionManager.Regions["CoountdownRegion"];
            var view = region.GetView(nameof(CountDownTimerView));
            if (view != null)  
                region.Remove(view);
        }
    }

倒计时while循环不会停止 . 但我从区域删除了视图 . 所以我无法杀死视图模型对象 . 如何处理视图模型对象?

1 回答

  • 0

    您可以向视图模型添加一个mehtod,允许您实际停止任务:

    public class CountDownTimerViewModel : ViewModelBase
    {
        private int duringTime = 100;
        private bool _isStopped;
    
        public CountDownTimerViewModel(IEventAggregator eventAggregator)
        {
            Task.Run(async () =>
            {
                while (!_isStopped && 0 < duringTime)
                {
                    await Task.Delay(TimeSpan.FromSeconds(1));
    
                    DuringTime--;
    
                    if (DuringTime == 0)
                        eventAggregator.GetEvent<CountdownComplateEvent>().Publish();
                }
            });
        }
    
        public void Stop() => _isStopped = true;
    }
    

    ...并在删除视图时停止它:

    IRegionManager regionManager = null;
    var region = regionManager.Regions["CoountdownRegion"];
    var view = region.GetView(nameof(CountDownTimerView)) as CountDownTimerView;
    if (view != null)
    {
        CountDownTimerViewModel viewModel = view.DataContext as CountDownTimerViewModel;
        if (viewModel != null)
            viewModel.Stop();
        region.Remove(view);
    }
    

相关问题