2009-08-21 10 views
1

私のジレンマは、ビューモデルでビューイベントを処理したいのですが、イベントハンドラを追加するためにビューにファイルの背後にコードがなければならないため、クラス属性を設定する必要があります。私は99%がこれは悪い考えであると確信しています。そして、正直なところ、私はそれをどうやって行うのかも分かりません(明白なx:Class = ""部分以外) MVVMアプリケーションですか?WPF MVVMでframeworkModeイベントをviewmodelハンドラにバインドする「適切な」方法は何ですか?

<ResourceDictionary> 
    <DataTemplate DataType="{x:Type vm:OutletViewModel}"> 
     <Button Click="IHaveNoBinding"> 
    </DataTemplate> 
</ResourceDictionary> 

答えて

4

使用commands

<Button Command="{Binding ACommandOnYourViewModel}"/> 

あなたのビューモデルで使用できる便利なコマンドの実装のための鉱山のthis postを参照してください。

コマンドを使用できないと仮定すると、attached command behaviorsを使用します。

+0

さてさて、私はコマンドを使用することはできませんと仮定し、 Textbox.TextChangedだとします。 – Firoso

+0

それに応じて編集されました。 –

+0

テキストの場合、バインディングを使用します。 decasteljau

2

添付された動作を使用します。添付された振る舞いは、基本的にイベントをコマンドに変換します。例えば、このリンクをチェックアウト:ここ

http://www.codeproject.com/KB/WPF/AttachedBehaviors.aspx

はTextChangedBehaviorためのコードです。

public static class TextChangedBehavior 
    { 
    public static readonly DependencyProperty TextChangedCommandProperty = 
     DependencyProperty.RegisterAttached("TextChangedCommand", 
              typeof(ICommand), 
              typeof(TextChangedBehavior), 
              new PropertyMetadata(null, TextChangedCommandChanged)); 

    public static ICommand GetTextChangedCommand(DependencyObject obj) 
    { 
     return (ICommand)obj.GetValue(TextChangedCommandProperty); 
    } 

    public static void SetTextChangedCommand(DependencyObject obj, ICommand value) 
    { 
     obj.SetValue(TextChangedCommandProperty, value); 
    } 

    private static void TextChangedCommandChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     TextBoxBase textBox = obj as TextBoxBase; 

     if (textBox != null) 
     { 
     textBox.TextChanged += new TextChangedEventHandler(HandleTextChanged); 
     } 
    } 

    private static void HandleTextChanged(object sender, TextChangedEventArgs e) 
    { 
     TextBox textBox = sender as TextBox; 
     if (textBox != null) 
     { 
     ICommand command = GetTextChangedCommand(textBox); 
     command.Execute(textBox.Text); 
     } 
    } 
    } 

XAML:

<TextBox behavior:TextChangedBehavior.TextChangedCommand="{Binding TextChangedCommand}" /> 
1

一般的に、私はこのような単純なもののために付属の行動パターンを使用しません。コンサルタントとして私はそれが新しい開発者のために複雑なことを見つける。

どのようにしてコマンドが利用できない場合でも、コントロールのやりとりを処理しますか?フロアから自分自身を選ぶ準備をしてください:-)私はしばしばこのためにコードを使用します。コードビハインドのイベントハンドラは、イベントを処理し、イベントargsから必要なデータを収集し、その要求をView Modelに転送します。あなたは、ICommandがhide/show/enable/disableを活用することができないほとんどの事柄をとにかく実行できないので、これを行うことで多くを失うことはありません。

ただし、いくつかのルールがあります。コードビハインドは、View Modelへの制御転送にのみ使用できます。イベントの引数をView Modelに直接渡さない限り、このようにイベントを使用することは問題ありません。その事実は大規模なアプリケーションであり、コードの背後にあることから常に離れることはできません。意図したとおりに使用すると、私はそうした操作に害を感じません。

0

コードビハインドはまったく悪いことではありません。 WPFデータバインディング(例:PasswordBox)を使用できず、コードビハインドファイルを作成する必要がある場合があります。このプロジェクトのViewModelに例に示されているどのように結合することなくPasswordBoxを使用することができます

WPFアプリケーションフレームワーク(WAF)

http://waf.codeplex.com

関連する問題