2016-10-03 25 views
0

MVVMを初めて使用し、尊重するためのガイドラインに従ってください。私は私のユーザーコントロールの1つにBusy-Animationを持っていたいと思います。私はこのようなコントロールにそれを含めたいと思っています。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のコンストラクタでこれを行うことにより、ViewModelに(そこからそれを制御するために)でBusyAnimationを登録しようとしました:

(DataContext as PageViewModel).BusyAnim = this; 

のDataContextは常にnullであるいくつかの理由とこの行の結果は例外です。私はここで間違って何をしていますか?

+1

例外のスタックトレースを必ず投稿してください。それはどこに投げられるのですか? – ltiveron

+0

BusyAnimationのコンストラクタで例外がスローされます。 – Ravior

答えて

1

私がMVVMのアイデアに反対したことをやってみました。 一般的なものを意図したオブジェクトをダウンキャストしようとしました。

私が達成しようとしたタスクの方が良いのは、ビジーなアニメーションコンポーネントに依存プロパティを実装することです。これらは、主に表示されるビューのビューモデルから拘束されることを意図しています。そのようにして、ビューモデルの一部のプロパティが変更されたときに、ビジーなアニメーションが表示されます。これは、例えば、「働く」という名前のブールである可能性があります。

これは私の忙しいアニメーションで依存関係プロパティのコードです:

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()関数をトリガーします。 ShowBusyプロパティ依存プロパティは、上記実施存在すること

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

:XAML以下

はbusyanimationがバックグラウンド作業を示すべきであることのviewmodelにバインド、busyanimationを使用して制御しています。もちろん、モデルからのIsBusyは、動作するためにはすべて、観測可能なパターンに従うべきです。

/ps:私は間違いを完全に文書化し、どのように解決しましたか。私はこの質問を作成するために何らかの形で得た否定的な点を取り除くことができますか?

関連する問題