0

Event、Handler、EventSetter などの WPF CodeBehid イベントを MVVM パターンに変換しようとしています。MVVM を使用しているため、System.Windows.Controls の使用は許可されていません。また、この問題を解決するためにサードパーティのライブラリも避けています。

次の CodeBehind Event Handler を MVVM Event-Handler に変換する方法を誰かが説明できますか? 回答を書きながら、できる限り説明してください。

XAML コード

<DataGridCheckBoxColumn Header="Select" Binding="{Binding Path=IsSelected}"> 
  <DataGridCheckBoxColumn.CellStyle> 
    <Style TargetType="DataGridCell"> 
      <EventSetter Event="MouseLeftButtonUp" Handler="ApprovedMouseUp"></EventSetter> 
    </Style> 
  </DataGridCheckBoxColumn.CellStyle> 
</DataGridCheckBoxColumn> 

コードビハインド

private void ApprovedMouseUp(object sender, MouseButtonEventArgs e) 
{ 
    if(sender is DataGridCell) 
    { 
        var temp = (sender as DataGridCell).Content; 
        if(temp is CheckBox) (temp as CheckBox).IsChecked = !(temp as CheckBox).IsChecked; 
    } 
} 
4

3 に答える 3

1

MVVMに関する経験則はほとんどありません....

  1. Modelsandは名前空間ViewModlesを参照しないでください。System.Windows.Controls
  2. あなたのModelsandViewModlesはイベントを処理するべきではありません。ICommandそのためにインターフェースを使用します。
  3. RoutedCommandModels / ViewModels では有効ではありません (ポイント 2 のため)。したがって、DelegateCommand /を使用しますRelayCommand

そうは言っても、MVVMでAttached Behaviorを記述した場合、上記のすべての点が完全に許可されます。

于 2011-10-19T04:58:36.160 に答える
1

また、 Caliburn Microライブラリを使用して、ViewModel のハンドラを View のイベントにアタッチすることもできます。

サンプルコード:

 ...  xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"....

 <Button Content="Edit" DataContext="{Binding Path=VmInstance}" 
             cal:Message.Attach="[Event Click] = [Action EditFilter]" />
于 2011-10-19T05:50:00.627 に答える
1

いくつかの選択肢があります。

  1. XAML でイベント ハンドラーをアタッチしますが、イベント ハンドラーが行う唯一のことは、適切な引数を渡してビュー モデルを呼び出すことです (ビュー モデルに GUI レベルの項目を渡さないことが重要です。アクションを実行するために必要なデータのみを渡します)。

  2. EventToCommandビヘイビアー (ここに示されています) を使用して、ICommand のインスタンス (ビュー モデルから) をビュー内のイベントにアタッチします。

これらのイベント ハンドラーをスタイルやテンプレートで設定しようとしない限り、オプション #1 を使用することをお勧めします。ビュー モデルが実際のものである限り、便利なときにイベント ハンドラーを使用することを禁止する鉄則はありません。すべての作業を行います

編集:オプション#1

private void ApprovedMouseUp(object sender, MouseButtonEventArgs e) 
{ 
    if(sender is DataGridCell) 
    { 

        var checkBox= (sender as DataGridCell).Content as CheckBox; 
        if(checkBox != null) 
        {
            var viewModel = (MyViewModel)checkBox.DataContext;
            viewModel.ToggleApprovedStatus();
        }
    } 
} 
于 2011-10-19T03:10:05.993 に答える