當視圖關閉時,我想關閉我的 ViewModel 內部的計時器。
我的代碼:
主視窗.xaml.cs:
public MainWindow()
{
InitializeComponent();
this.DataContext = new UnitViewModel();
Console.WriteLine(System.AppDomain.CurrentDomain.BaseDirectory);
}
單元視圖模型.cs
class UnitViewModel : ObservableObject
{
DispatcherTimer dispatcherTimer = new DispatcherTimer();
public UnitViewModel()
{
StartTimer();
}
private void StartTimer()
{
dispatcherTimer.Tick = new EventHandler(dispatcherTimer_Tick);
dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 600);
dispatcherTimer.Start();
}
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
UpdateUnit();
}
}
當 MainWindow 關閉時,有沒有辦法停止這個計時器?或者不再打開。我更喜歡在我的 viewModel 中使用此代碼,是否有解決 MVVM 中的此問題的好方法?
uj5u.com熱心網友回復:
向停止計時器的視圖模型添加某種公共 API:
public void Stop() => dispatcherTimer.Stop();
以一種或另一種方式從視圖中呼叫此方法。
例如,您可以處理事件或覆寫代碼隱藏中的方法:
protected override void OnClosing(CancelEventArgs e)
{
base.OnClosing(e);
(DataContext as UnitViewModel)?.Stop();
}
...或EventTrigger在呼叫命令的 XAML 標記中使用 :
<i:Interaction.Triggers>
<i:EventTrigger EventName="Closing" >
<i:InvokeCommandAction Command="{Binding StopCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
這兩種方法都符合 MVVM 設計模式。
uj5u.com熱心網友回復:
只需將您的視窗傳遞給 ViewModel 并將 Closing 事件系結到 OnClosing 方法:
public class UnitViewModel
{
public UnitViewModel(Window w)
{
mainWindow = w;
mainWindow.Closing = OnMainWindowClosing;
}
private Window mainWindow;
private void OnMainWindowClosing(object sender, EventArgs e)
{
dispatcherTimer.Stop();
//anything else you want
}
}
public MainWindow()
{
InitializeComponent();
this.DataContext = new UnitViewModel(MainWindow);
Console.WriteLine(System.AppDomain.CurrentDomain.BaseDirectory);
}
uj5u.com熱心網友回復:
就個人而言,我根本不會在視圖模型中使用調度程式計時器。我可能會改用異步和回圈。600 毫秒的延遲將由
await Task.Delay(600);
這將進入一個最適合的回圈。
我還首先在單視窗應用程式中使用視圖模型,以便從該視圖模型中對視圖進行模板化。處理視圖模型,視圖就會消失。
如果它絕對必須是具有視圖模型的單獨視窗,則使視圖模型成為該視圖的私有成員。關閉視窗并處理視圖模型。如有必要,使用弱參考/事件將視圖模型與任何模型分離。不過,我的模型通常是一個 Web api。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/383684.html
下一篇:如果陣列元素發生變化,則可觀察
