2012-05-09 15 views
0

特定のICommandが実行された後、コントロールに視覚効果を加える必要があります。たとえば、私のカスタムコントロールはAAACommandとBBBCommandプロパティを公開します。UserControlでコマンドが呼び出されたときを知る方法?

<myControl AAACommand={Binding ACommand} 
      BBBCommand={Binding BCommand} /> 

ここで、ACommandとBCommandはViewModelのコマンドです。 AAACommandがいつ実行されたかを知るために、私はUserControlでいくつかのUIを行うことができますか? ICommandがサブスクライブするExecutedイベントはありません。

編集: AAACommandは私のユーザーコントロール上で、このように定義されています

public static readonly DependencyProperty AAACommandProperty = 
     DependencyProperty.Register("AddCommand", typeof(RelayCommand), typeof(MyCustomControl), null); 

public static readonly DependencyProperty AAACommandParameterProperty = 
     DependencyProperty.Register("AAACommandParameter", typeof(object), typeof(MyCustomControl), null); 

public RelayCommand AAACommand 
{ 
    get { return (RelayCommand)GetValue(AAACommandProperty); } 
    set { SetValue(AAACommandProperty, value); } 
} 

public object AAACommandParameter 
{ 
    get { return (object)GetValue(AAACommandParameterProperty); } 
    set { SetValue(AAACommandParameterProperty, value); } 
} 

だから、ViewModelににaCommandはを呼び出すことで問題はありません、これは問題なく動作します。問題は、AAACommandがACommandをいつ実行するかをユーザのコントロールがどのように知るのかということです。そのため、UIで何かを行うことができます。

答えて

0

ビューモデルから返された応答とコマンドの実行に基づいてユーザーコントロールを更新しますか? 1つのユーザーコントロールから別のユーザーコントロールに文字列値として渡したいと思っていた質問と同様の質問をしました。私はINotifyProperty Changedイベントを使ってこれを達成しました。 2つのうちの1つが起こる可能性のようにそれはそうあなたのコメントに

ベースを:コメントを投稿するには、元の質問とソリューションhere

アップデートを読み取ることができます。 VMが応答する必要がない場合は、ビュー内の要素によって更新がトリガーされる可能性があります。 Binding ElementNamePropertyを使用してこれを行うことができます。これは、本質的に、別の要素の動作に基づいてプロパティをトリガ/変更することを可能にします。 (1つのフィールドにテキストを入力すると、別のコントロールの値が表示されます)Here is the msdn description and example

戻り値(成功または失敗)に基づいて呼び出す必要がある場合、ViewModelはUIの要素のプロパティに双方向でバインドされたプロパティ(ブールのような)を持つ必要があります。 バインディングを処理するコンバータ(継承するIValueConverter)を作成する必要がありますが、INotifyProp Changeを使用して、コントロール内のコントロールまたはバインドされた要素間の更新をマーシャリングします。私のXAML内

は私が二次ユーザーコントロール内の別のボタンがクリックされるまで、UIの中に表示されるようにしたくなかったユーザーコントロールを追加:ここで

は簡単な例です。viewmodel内Visibilityプロパティ

<ctrl:LandingPage x:Name="ucLandingPage" 
            Grid.Row="1" 
            DataContext="{Binding}" 
            Visibility="{Binding LandingPageVisibility, Mode=OneWay, Converter={StaticResource LandingPageVisibilityConverter}}"/> 

に結合、このIセットアップを扱うために、私はバージョンinotifyはベースに含まれていSimpleMVVMフレームワークを使用してVM(ノートに次のプロパティとコード

// Default ctor 
     public SearchViewModel() 
     { 
      //Show that the Landing Page control is being displayed 
      SearchVisibility = Visibility.Collapsed; 
} 

プロパティを持っていましたオブジェクトは、このプロパティを更新VM内のメソッドその後

private Visibility _SearchVisibility; 
      public Visibility SearchVisibility 
      { 
       get { return _SearchVisibility; } 
       set 
       { 
        _SearchVisibility = value; 
        NotifyPropertyChanged(m => m.SearchVisibility); 
       } 
      } 

)私の通知小道具イベントは、あなたとは少し異なる場合がありますので

public void GetSearchResult() 
     { 
      currentPage = 1; 
      //Set the visibility of the search control in the center of the page 
      SearchVisibility = Visibility.Visible; 
      this.SearchHistory = this._DataModel.AddSearchHistoryItem(this.SearchTerm); 
     } 

そして最後に要素

public class SearchVisibilityConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if (value != null & System.Convert.ToString(value) == "Visible") 
      { 
       return Visibility.Visible; 
      } 
      else 
      { 
       return Visibility.Collapsed; 
      } 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
+0

の正しいプロパティ値に戻り値を変換しますコンバータクラスいいえ、私はViewModelにはresponed何気にいけません。私はちょうど私のUserControlでこれをしたい:コマンドを呼び出すと、VIewModelの結果に関連していないカスタムロジックを実行した後。私のUserControlのアクションは、例えば、何かを展開したり、赤色などの色を付けたりすることができます。UIにコマンドをインターセプトするには、配線メカニズムがあるため、何らかの方法が必要です。 – Goran

+0

@ゴラン私はこれが助けてくれることを望む、さらなる説明の例で私のコメントを更新しました – rlcrews

+0

バインドできるUI要素がないのでElementNameを使用できません。コマンドからの戻り値はありません。私は解決策がCommandManagerにあると思うが、私はまだ解決策を見つけることができなかった。最後の手段は、MVVMのライトフレームワークからのものであるため、RelayCommandの実装を変更することです。ソースコードが利用可能です。 – Goran

関連する問題