質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

解決済

MVVMで実装しているUserControlでViewの依存関係プロパティとVMのプロパティを連動させる方法

tuyudaku
tuyudaku

総合スコア70

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1回答

0評価

4クリップ

540閲覧

投稿2022/01/18 09:11

UserControlをMVVMで実装しています。
UserControlにいくつかの依存関係プロパティを定義しているのですが、
その値にVMで処理した結果を使用したい場合があります。

例えばUserControl内にボタンを配置して、それが押されると「Push!」という文字列が依存関係プロパティにセットされるというようなものを作りたいとします。

その場合、私が現在行っている実装方法は
・VMにPropertyChangedEventHandlerのイベントを発火するstringプロパティを定義。
・ボタンにはVMで定義したコマンドをバインド。
・コマンド内でstringプロパティに"Push!"を代入。
・VMからプロパティ変更通知が発火。
・Viewでプロパティ変更通知を受信して、VMのstringプロパティを参照してViewの依存関係プロパティへ代入。

というような手順で行っています。
これで望み通りの動作はしてくれていますが...
まぁ、あまり美しくはないかな...と思っています。

このような実装をしたい場合、他にスマートな実装方法はありますでしょうか?
UserControlをMVVMで実装する必要性は?とかの意見はあると思いますが、
とりあえずMVVMで実装する前提で回答を頂けるとありがたいです。
よろしくお願いいたします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

TN8001

2022/01/18 11:35

MVVM教の方のようですので回答はしません(話が合わないので)が、下記どちらなのかは気になります。 * (Windowの一部を切り出した)部分ビュー的なもの  DependencyPropertyは必要ありません。  親VMが欲しければそのままDataContextに流れてきます。 * 独自コントロールのようなもの  無理にMVVMする必要はありません。  より汎用性を上げるためカスタムコントロールにすることを検討します。 [.net - Wpf UserControl and MVVM - Stack Overflow](https://stackoverflow.com/questions/3333934/wpf-usercontrol-and-mvvm [WPFアプリのMVVM構造の設計時に留意すべきこと - cactuaroid blog](https://cactuaroid.hatenablog.com/entry/2018/08/13/232738 [WPF MVVMスタイルでのUserControlに対するデータの入出力について](https://teratail.com/questions/292544
tuyudaku

2022/01/19 00:20

>MVVM教の方のようですので MVVMを勉強中、かつそういう方針で実装しなければならない という感じです。 といってもそこまで強制ではないですが。 >(Windowの一部を切り出した)部分ビュー的なもの 共通して使用するパーツをユーザーコントロール化したもの というイメージです。 > 独自コントロールのようなもの どちらかといえばこちらに近いかな? でもただのコントロール群ではあるのでやはり部分ビューなのでしょうか? 言ってしまうと、動画再生コントロールという感じです。 再生部、操作部などをまとめたものです。 ここの作成に関しては何度かTN8001さんにお世話になっております...w >無理にMVVMする必要はありません。 最初はそう思っていたのですが、 MVVMで作れそうなところはなるべくそうしよう という空気というか圧がありまして... MVVM勉強中だし頑張ってみるか!という感じです。 >より汎用性を上げるためカスタムコントロールにすることを検討します。 ネットで検索した感じの意見だと、 ユーザーコントロールをMVVMで作る必要はない カスタムコントロールをMVVMで作るなら分かる というような感じでしたが、TN8001さんもそのような意見でしょうか?
TN8001

2022/01/19 03:45

> 言ってしまうと、動画再生コントロールという感じです。 > 再生部、操作部などをまとめたものです。 1回しか使わないなら部分ビューと見ていい気はします。 ユーザーコントロールに切り出さずにWindowにべたに書いてきれいに書ける(コード量は多くなるがまどろっこしいところはない)なら、(切り出す範囲を間違わなければ)ユーザーコントロール化もきれいにできるはずです。 複数回使うなら事実上(見た目のカスタマイズ性を捨てた)カスタムコントロールと見れるので、その場合はButtonやListBoxのようにあなた以外にもだれでも使える(ライブラリを作る)つもりで書かないとおかしなことになります(この辺頭の切り替えが必要です) > ユーザーコントロールをMVVMで作る必要はない > カスタムコントロールをMVVMで作るなら分かる > というような感じでしたが、TN8001さんもそのような意見でしょうか? 逆ですね。 * ユーザーコントロールを 1. の方(部分ビュー的なもの)と考えるならMVVMで作るのも分かる * カスタムコントロールをMVVMで作る必要はない と考えています。 普通カスタムコントロールはBindingを使用しません(TemplateBindingやRelativeSourceによる自身のDependencyPropertyへのバインドはあります) 例えばButtonViewModelなんてものはありませんよね? もちろん外に見えないだけで内部ではバインドしているカスタムコントロールもあるとは思いますが、それは一般的に言うMVVM(コードビハインドを書かない)とはだいぶ実態が違うと思います(バリバリコードビハインド書いているんので)
TN8001

2022/01/24 11:12

tuyudakuさん だんまりになってしまいましたが、やっぱり話が合わないということでしょうか? [WPF MVVMスタイルでのUserControlに対するデータの入出力について](https://teratail.com/questions/292544 [MVVM構造のUserControlに依存関係プロパティを生やして親画面のVMにバインドしたい](https://teratail.com/questions/362091

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです