2011-07-28 10 views
3

私は、MVVMの開発パターンに従って、かなり単純なアプリケーションをWPFで作成しようとしていますが、単純なことをするのがいかに難しいかを狂ってしまいました。私はすでにFormsでこのアプリケーションを作成し、正常に実行していましたが、私の上司はWPFのインターフェースを技術のデモとして書き直すように要求しました。私は可能な限り多くのベストプラクティスに従うことを試み、アプリとコードをできるだけ教育的にすることに決めました。私の現在のジレンマは、リストボックスを使用して、選択が変更されるたびにコードを実行しています。私はちょうどイベントでコードビハインドを使用して、ビューモデルのメソッドを呼び出す準備ができました。私にとっては、ロジックが実行されていないので、これは本質的にMVVMであるようです。助けてください/洞察力に感謝します。MVVM WPFのリストボックスにコマンドをバインドする簡単な方法はありますか?

答えて

2

あなたは単に選択に...リストボックスのSelectedItemプロパティをバインディングは、ビューモデルのセッターが呼び出され、あなたが欲しい、これまで何を行うことができます変更することを行うことができます...ここで

は意志のサンプルです助けあなた

XAML

<Grid Canvas.Left="0" Canvas.Bottom="0" Height="300" Width="300" Background="Bisque"> 
      <ListBox ItemsSource="{Binding Employes}" SelectedItem="{Binding SelectedEmploye}"/> 
     </Grid> 

ビューモデル

public class ViewModel : ViewModelBase 
    { 
     private List<Employee> _employes; 

     public List<Employee> Employes 
     { 
      get { return _employes; } 
      set { _employees = value; OnPropertyChanged("Employes"); } 
     } 
     private Employee _selectedEmploye; 

     public Employee SelectedEmploye 
     { 
      get { return _selectedEmploye; } 
      set 
      { 
       _selectedEmployee = value; 
       OnPropertyChanged("SelectedEmploye"); 
      } 
     } 

    } 

ビューモデルベース

public class ViewModelBase : INotifyPropertyChanged 
    { 
     protected virtual void OnPropertyChanged(string propertyName) 
     { 
      if (this.PropertyChanged != null) 
      { 
       this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
     public event PropertyChangedEventHandler PropertyChanged; 
    } 

従業員クラス

public class Employee : ViewModelBase 
    { 
     private string _name; 
     public string Name 
     { 
      get { return _name; } 
      set { _name = value; } 
     } 
    } 
+0

これは本当に私を正しい方向に向けるのに役立ちます。ありがとうございました。 – Paul

+0

これは実際には良いことです。しかし、 'Loaded'イベントのように回避策を講じることが不運な場合は、' EventToCommand'フレームワークが必要です。 –

0

アウトEventToCommand行動Galasoft MVVM LightあなたのViewModelに

Here's the SO post

+0

私はそれをある程度深く確認する必要があります。私は本当にプロジェクトに別のフレームワークを追加することを避けることを本当に望んでいた。 – Paul

2

にあなたはプロパティ "のSelectedItem" を作成することができます。リストボックスをプロパティにバインドする場合は、SelectedItemプロパティをバインドします。

  • POCO clrプロパティ(INotifyPropertyChanged)の場合は、プロパティセッターからコードをトリガーできます。
  • DependencyPropertyの場合、PropertyChangedCallbackを追加してそこからコードをトリガーする必要があります。
1

コードビハインドの使用を心配しないでください。コードビハインドは、あまりにも多くのロジックがビューに配置されるのを避けるためのガイドラインであり、ハードで迅速なルールではありません。この場合(他の人が示唆しているように)、SelectedItemプロパティをviewmodelのいくつかのプロパティにバインドできます。非データ関連のイベントでは、通常のようにイベントを処理し、実行ロジックをビューモデルに委任することをお勧めします。

私の意見では、デザインパターンは、通常、物事を悪化させるほど厳密には適用されないので、いつも大雑把に判断して判断する必要があります。

+0

私はここであなたに同意する傾向がありますが、幸運にも私は私がしなければならないと思ったすべてのフープを飛び越えずにこれを行う簡単な方法があるように見えます。 – Paul

+0

@ pauleck1 - あなたが不必要にフープを突き抜けているような気がしたら、一歩踏み込んで正しいアプローチを取っているかどうか再考するときが来ます。そこにはすべてのMVVMフレームワークがあるので、絶えず物事を過剰にエンジニアリングし、コードを保守しにくくするのは簡単です(これは多少目的を破ります)。 MVVMが悪いと言っているわけではありませんが、WPFを使って作業するときは、確かに私の武器です。 – Moonshield

0

あなたのVMで選択した項目を取得するためにListBox.SelectedItemに特異的に結合することができます。

関連する問題