2016-10-03 71 views
0

Im新到MVVM,並嘗試遵循所有我認爲尊重它的原則。我想在我的一個用戶控件上有一個忙碌動畫。我想把它包括在這個控件上。在DataContext中註冊UserControl時發生WPF MVVM異常

用戶控件它嵌套在上使用一個DataTemplate用於視圖模型的主窗口中示出,例如,像這樣:

<Window.Resources> 
    <DataTemplate DataType="{x:Type AppViews:AppConfigViewModel}"> 
     <local:AppConfigView /> 
    </DataTemplate> 
</Window.Resources> 

<Grid> 
    <ContentControl Content="{Binding CurrentPageViewModel}" /> 
</Grid> 

當運行此,示出了應用與我也看到由於基礎值在視圖中正確顯示,因此可正確綁定的AppConfigViewModel視圖。

現在我試圖在BusyAnimation的構造這樣做是爲了註冊BusyAnimation在視圖模型(從那裏控制它):

(DataContext as PageViewModel).BusyAnim = this; 

出於某種原因,在DataContext總是空和這條線的結果是一個例外。我在這裏做錯了什麼?

+1

請務必記得發佈您的Exception的stacktrace。它在哪裏拋出? – ltiveron

+0

Exception在BusyAnimation的構造函數中拋出。 – Ravior

回答

1

我試圖做的是反對MVVM的想法。 我試圖向下轉換一個意思是一般的對象。

對於我試圖實現的任務,更好的方法是在繁忙的動畫組件中實現依賴項屬性。這些意味着要從主要展示視圖的視圖模型中綁定。這樣,當視圖模型中的某些屬性改變時,可以顯示忙碌的動畫。這可能是一個名爲「working」的布爾。

這是我忙碌的動畫依賴屬性代碼:

public static readonly DependencyProperty ShowBusyProperty = DependencyProperty.Register("ShowBusy", typeof(Boolean), typeof(FortschrittView), new PropertyMetadata(false, OnShowBusyPropertyChanged)); 
public Boolean ShowBusy 
{ 
    get { return (Boolean)this.GetValue(ShowBusyProperty); } 
    set { this.SetValue(ShowBusyProperty, value); } 
} 

private static void OnShowBusyPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
{ 
    FortschrittView myUserControl = dependencyObject as FortschrittView; 
    myUserControl.OnPropertyChanged("ShowBusy"); 
    myUserControl.OnShowBusyPropertyChanged(e); 
} 
private void OnShowBusyPropertyChanged(DependencyPropertyChangedEventArgs e) 
{ 
    if(ShowBusy) 
    { 
     Start(); 
    } 
    else 
    { 
     Stop(); 
    } 
} 

是其大量的代碼,但我覺得WPF希望這種方式。記住上面的代碼位於繁忙動畫用戶控件中,並觸發控制故事板的Start()Stop()函數。

下面XAML是在使用的busyanimation,它綁定到一個視圖模型的busyanimation應說明背景,工作控制:

<local:BusyAnimation ShowBusy="{Binding Model.IsBusy}"/> 

這ShowBusy物業有實現上述的依賴項屬性。當然,來自模型的IsBusy應該遵循可觀察的模式來運行所有的東西。

/ps:我完全記錄了我所犯的錯誤以及我如何解決它們。我可以擺脫我以某種方式創造這個問題的負面觀點嗎?