2015-04-20 146 views
2

我正在研究一個新的c#MVVM light現代ui WPF應用程序,並且遇到了一些奇怪的觸發器行爲。所以要描述的情況,這裏是以下內容:MVVM light RelayCommand觸發兩次

我有一個帶有觸發器的XML視圖。 (已裝入的方法如實施例)

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="Loaded"> 
     <i:InvokeCommandAction Command="{Binding LoadedCommand}" /> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

與relaycommand(LoadedCommand從抽象模型)構造函數

public MovieListModel() 
    { 
     LoadedCommand = new RelayCommand(LoadData); 
    }   
    private void LoadData() 
    { 
     Debug.WriteLine("MovieListModel - LoadData"); 
    } 

問題: 應用程序啓動時的loadedcommand被稱爲1次(良好)。當我導航到應用程序內的其他頁面時,第一個和新視圖LoadedCommand被觸發。其他命令也會觸發兩次。我猜測如果我想在後面加入一些編程邏輯,這將成爲一個問題。

完整的Debug.WriteLine是如下:

ModernUserControl - OnNavigatingFrom 
MovieListModel - NavigatingFrom 
ModernUserControl - OnNavigatingFrom event called 
ModernUserControl - OnNavigatedFrom 
MovieListModel - NavigatedFrom 
ModernUserControl - OnNavigatedFrom event called 
ModernUserControl - OnNavigatedTo 
MovieListModel - LoadData 
SettingsModel - LoadData 

信息: 我發現在示例程序這個問題在這裏找到:https://github.com/saramgsilva/ModernUISamples,在我自己的應用程序。我還在github上啓動了一張票,瞭解這是否是問題/錯誤。 (還沒有答覆)

+0

你說你使用加載作爲一個例子,你有沒有試着用其他的活動?因爲我知道加載是觸發兩次 – Moddaman

回答

2

我建議避免WPF中的Loaded事件代碼只能運行一次。

WPF卸載未使用的控件(例如,如果應用程序已最小化,或者您更改標籤頁),所以Loaded命令通常會運行多次。

如果代碼只運行一次,我通常會將它放入構造函數或延遲加載數據到getter中。

如果我真的想將Loaded事件用於只能運行一次的事件,那麼我將確保在第一次運行時從Loaded事件處理程序中分離事件。

+0

啊好的謝謝。我仍然困惑爲什麼這也在OnNavigate方法中發生,但我會盡力解決它。現在我知道這不是我的應用程序中的錯誤,謝謝! (和thx所有其他答案) – RolandMakkelie

相關問題