2011-09-09 12 views
1

異なるプロセスが開始されると、ある種のアニメーションを表示する必要があります。私の最初のアイデアは、XAMLに<ContentControl>というタグを追加してView Modelオブジェクトのプロパティにバインドし、単にこのプロパティをProgressBarに割り当てたり、ビジーなスピナーなどを割り当てたものです。動的にコントロールを提示するMVVMの方法

これは機能しますが、私はそれが好きではありません。私が気に入らない主な理由は、ビューモデルがプレゼンテーションの問題に関与すべきではなく、このパターンがそのパラダイムを明確に破るからです。

これはかなり私の(醜い)コードは、ATMのようになります。

XAML:

ビューModelクラスで
<ContentControl Content="{Binding ProcessAAnimation}" /> 

:だから

public object ProcessAAnimation 
{ 
    get { return _processAAnimation; } 
    private set 
    { 
     _processAAnimation = value; 
     OnPropertyChanged("ProcessAAnimation"); 
    } 
} 

public object IsProcessARunning 
{ 
    get { return _processARunning; } 
    private set 
    { 
     if (value == _processARunning) 
      return; 
     _processRunnings = value; 
     if (value) 
      ProcessAAnimation = SomeNiftyAnimationControl(); 
     else 
     { 
      if (ProcessAAnimation is IDisposable) 
       ((IDisposable)ProcessAAnimation).Dispose(); 
      ProcessAAnimation = null; 
     } 
    } 
} 

// (clipped: More properties for "Process B", "Process C" and so on) 

、より良いパターンがありますこれを達成する。好ましくは、XAMLだけを使用してアニメーションコントロールを動的に作成できるパターンですか?

私はすでに私は、3つの異なるアニメーションコントロールを宣言し、表示モデルの状態に彼らのVisibilityプロパティをバインドするソリューションをテストしていることに注意してください。しかし、私はコントロールを隠すことはしたくないので、私の本ではそれは下にあります。私はコントロールを必要としない限り消えてしまいます。また、それによって、必要に応じてさまざまなタイプのアニメーションを動的に使用することも不可能になります。

誰でも?

+0

MVVMは、ブレークのポイントである場合は、添付の行動(http://www.codeproject.com/KB/WPF/AttachedBehaviors.aspx)が救助のために来ています。また、PRISM(http://compositewpf.codeplex.com/)を見てみると、共通のコンテンツ領域に動的ビューを収めることができます。 –

答えて

2

あなたのViewModelは操作と進行状況自体を知っています。残りの部分は、トリガを使用して実行できます。少なくともそれは私たちがやる方法です。たとえば、あなたのViewModelは、ビューモデルが大きな画像を読み込むためにBackgroundWorkerを起動したときに設定されているプロパティ "IsLoadingImage"を持っています。これはBackgroundWorker "ImageLoadingProgress"によって報告された進捗も返します。 。あなたのビューは、プログレスバーまたは特別なアニメーション用のカスタムコントロールで構成されています。トリガの "IsLoadingImage"をバインドして、ProgressBar/Animationコントロールの可視性を切り替えることができます。これらの値は "ImageLoadingProgress"にバインドされています。

私が言ったように、我々はそれを処理する方法thatsの、そして私たちのアプリケーションは、MVVMを多用して。

編集はコメントへの対応:トリガーでテンプレートを変更する方法

<ControlTemplate x:Name="ActiveTemplate" TargetType="{x:Type MyType}"> 
    <!-- Template when active --> 
</ControlTemplate> 

<ControlTemplate x:Name="DeactivatedTemplate" TargetType="{x:Type MyType}"> 
    <!-- Template when deactivated --> 
</ControlTemplate> 

<Style TargetType="{x:Type MyType}"> 
    <Setter Property="Template" Value="{StaticResource DeactivatedTemplate}"/> 

    <Style.Triggers> 
     <DataTrigger Binding="{Binding IsActive}" Value="True"> 
      <Setter Property="Template" Value="{StaticResource ActiveTemplate}"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

これはMyTypeControlTemplateを持っており、DataContextを切り替えるには、プロパティIsActiveを持つことができ制御であることを前提としていテンプレート。

+0

さて、これまで(VMを使ってアニメーションの可視性を制御していましたが)、必要なときにのみ進捗アニメーションコントロールを実際にインスタンス化してから処分する方が好きです。私は、主にパフォーマンス上の理由からその方法を好んでいます。だから、基本的に、私が知りたいことは:トリガーを使って、XMLを使ってコントロールをインスタンス化して処分できるかどうかです。 –

+0

もちろん、トリガー内のContentControlのContentTemplateを変更することができます。 – dowhilefor

+0

それはとても興味深いですね。私は正しい方向に私を置くためにあなたが非常に短いコード例を与えることができると思いますか? –