ham_chick
@ham_chick (ハムちっく)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

MVVMパターンにおけるコントロールのプロパティ変更について

Discussion

MVVMパターンに従ってWPFアプリケーションを作成しています。

MVVMに則った場合、

  • ボタンをクリックしたらボタンの背景色をLime色にしたい
  • 処理が完了したらLime色にしたボタンの背景色を戻したい

のような処理は、View、Model、ViewModelのどれに記述すべきなのでしょうか?

ViewModel.cs
public class ViewModel
{
    public ICommand BtnClickCommand { get; set; }

    public PersonCommandViewModel()
    {
        BtnClickCommand = new RelayCommand(ClickNotify);
    }

    private void ClickNotify()
    {
        MessageBox.Show("clicked","Clicked");
    }
...
}
View.xaml
<StackPanel>
    <Button Command="{Binding BtnClickCommand}">BUTTON</Button>
</StackPanel>
0

無回答なので一言

View、Model、ViewModelのどれに記述すべき

Viewでしょう。

但し、Lime色に信号機のように隣接する信号機と色の情報を交換している場合はViewModelとなります。

処理が完了したら

一見、完了という情報により、色を変化させていますが、Modelと色の情報をやり取りしていないという仮定ならViewでしょう。

ボタンをクリック

このイベントでデータ操作するので処理はViewModelになりますが、色はボタンの状態(プロパティ)から、Viewにて変化させます。

私は面倒なのでズルしてViewModelにします。要するにルールではなくガイドラインと思って下さい。

1Like

ViewModelに処理中かどうかのフラグを持たせ、それをボタンの背景色プロパティにコンバータ経由でバインドはいかがでしょうか?

処理中かどうかフラグ:Bool
コンバータ:BoolからBrush(多分?)へのコンバータ

邪推ですが処理中にボタンの無効化も必要そうな気がするので、そこもこのフラグで対応可能と思います。

2Like

@HalHarada
ご回答ありがとうございます。

今回はボタンクリックされた際に

  • ViewModelと情報をやり取りし、「何かしらの重たい処理」を開始する
  • 「何かしらの重たい処理」の実行中はボタンの背景色をLime色にしておきたい

の後者の実装についての質問でした。
View(のコードビハインド)に記載する場合は、
ボタンに対して、クリックイベントの登録+コマンドの登録を行い、

  • 重たい処理の開始⇨コマンドにて(ViewModel)
  • 表示の変更⇨クリックイベントにて(View)

のような実装になるイメージでしょうか?

0Like

@t0208n
ご回答ありがとうございます。
アイデア、参考にさせていただきます。

純粋な疑問ですが、今回教えていただいた方法は通例というかベストプラクティスとして
みなさん採用されているのでしょうか?

0Like

ベストプラクティスがあればよいのですが?

今にはMVVMとは真逆のマイクロサービスにトライしてます。python(wsgi),pandas,javascript,cssでAjaxとRestAPIで試行錯誤中です。

0Like

ベスプラかどうかはケースバイケースですね。
小規模なものであればViewのコードビハインドでやってしまう方がシンプルでわかりやすいと思います。

MVVMパターンに従うと結果論としてコードビハインドに書かないということになる事が多く、そのための機能であるコンバータなどは触っておいて、損はないと思います。

1Like

Your answer might help someone💌