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

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

ただいまの
回答率

90.98%

  • C#

    5794questions

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

  • WPF

    608questions

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

  • MVVM

    65questions

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

[WPF][MVVM][Prism]異なるxamlのCommandを実行したい。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 414

nabesann203

score 33

お世話になります。
WPF+Prismフレームワークでの開発を勉強しています。
Prismの性質上、Moduleごとにxamlを分ける箇所の実装方法(Commandの記法)について、ご教授いただきたく。

◆理解できている部分
ViewにてCommandを明記し、関連するViewModel上の同Commandを実行できる事は理解しました。
(下記①のボタンを押下時に、②のExecuteCommnadが実行される。)


①View.xaml

<UserControl x:class ~略~>
    <Button Content="実行" Command="{Binding ExecCommand}" />
</UserControl>


②ViewModel.cs

public class FindFormViewModel {
    // 実行したいコマンド
    public DelegateCommand ExecCommand { get; private set; }
    // コンストラクタ
    public FindFormViewModel() {
        ExecCommand = new DelegateCommand(Execute, CanExec);
    }
    private bool CanExec() { ~略~ }
    private void Execute() { ~略~ }
}

◆質問事項(理解できていない部分)
上記のExecuteCommnadを、別のxamlから呼び出したいです。
具体的には、MenuItem(メニューバー)から実行したいですが、
★の箇所について、色々試しても分からず。。

Menu.xaml

<UserControl x:class ~略~>
    <Menu>
        <MenuItem Header="ファイル">
            <MenuItem Header="ここからも実行できるよ" Command="★ここにどう書く??★" />
        </MenuItem>
    </Menu>
</UserControl>

<xamlの関連が記載が漏れていたため追記。>
View.xamlMenu.xamlはそれぞれ独立しており、Shellのxamlからそれぞれを参照しています。

Shell.xaml

<Window>
    <Grid>
        <!-- Menu.xaml -->
        <ContentControl prism:RegionManager.RegionName="MenuRegion" />
        <!-- View.xaml -->
        <ContentControl prism:RegionManager.RegionName="ViewRegion" />
    </Grid>
</Window>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

こんにちは。

DataContextを使ったViewとViewModelの関係については理解していますか?
PrismだとひょっとするとUnityなどで勝手にViewModelがロードされているかもしれませんが、XAMLでバインド表記されているCommandoは対象DataContextのCommandへのバインドです。
ですので、別のXamlから実行したいのであれば同一のインスタンスをバインドすればよいです。

上記についてわからない点があれば、まずはその部分から学習されるのが宜しいと思います。
PrismというよりWPFの基本的なViewとViewModelの関係性だと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/17 19:42

    回答ありがとうございます。
    確かにPrismでは色々省略出来るため、根本は理解できていないかもしれません。
    少しずつ確認をしようと思いますが、今回の質問は「Prismを使用した場合はどう実装するか」です。

    「Prismでは特別な手法は用意されてないので、WPFの基本的な実装しかない」という回答で間違いないでしょうか?

    キャンセル

  • 2018/01/17 19:45

    「PrismでコマンドなどViewModelの実装を簡略化するものなどはあるが、今回の問題はWPFの基本的な実装に関するものでPrismは関係ない」です

    キャンセル

  • 2018/01/17 19:48

    分かりました。ありがとうございました。

    キャンセル

+1

亀レスですが要望通りのことをしようとすると以下のようなことをすれば出来ます。

まず、コマンドを共有したい View で同じ ViewModel の型が割り当てられるようにします。

ViewModelLocatorProvider.Register<View, FindFormViewModel>();
ViewModelLocatorProvider.Register<Menu, FindFormViewModel>();

この時点でコマンドは参照できるようになりますが、おそらく ViewModel のインスタンスが異なります。一緒にしたい場合には、DI コンテナにシングルトンとして登録します。Unity の場合には以下のようになります。

Container.RegisterType<FindFormViewModel>(new ContainerControlledLifetimeManager());

こんな感じで出来ますが ViewModel のインスタンスがシングルトンになることで被る影響の方が大きい気がします。

因みに、コマンドを共通化したいのは多分それぞれのボタンやメニューを選択したときに実行するロジックを共通化したいのだと思いますが、そういう場合は以下のようにするほうが理想的です。

class SomeModelClass
{
   public void ExecuteLoginc() { }
}

// これが View.xaml 用の VM
class FindFormViewModel
{
    private readonly SomeModelClass _someModelClass;

    public FindFormViewModel(SomeModelClass someModelClass)
    {
        _someModelClass = someModelClass;
    }

    // コマンドの定義は省略
    // 以下のメソッドがコマンドの Execute に割当たってるとする
    private void CommandExecute() =>
        _someModelClass.ExecuteLogic();
}

// これが Menu.xaml 用の VM
class MenuViewModel
{
    private readonly SomeModelClass _someModelClass;

    public FindFormViewModel(SomeModelClass someModelClass)
    {
        _someModelClass = someModelClass;
    }

    // コマンドの定義は省略
    // 以下のメソッドがコマンドの Execute に割当たってるとする
    private void CommandExecute() =>
        _someModelClass.ExecuteLogic();
}

そして、この SomeModelClass のインスタンスを DI コンテナにシングルトンで登録する感じです。

Container.RegisterType<SomeModelClass>(new ContainerControlledLifetimeManager());

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/21 18:47 編集

    ありがとうございました。亀レスなんてとんでもないです。
    質問しても、ここの人達は手法は教えてくれない所なんだなーと思ってた所でしたので、、
    (考え方は指摘もらえましたので、ありがたかったですが。)

    |ViewModel のインスタンスがシングルトンになることで被る影響の方が大きい気がします。
    |因みに、コマンドを共通化したいのは~

     PrismはModule単位にMVVMの構成が組めるので、あえてシングルトンにして、
     「そのViewでやりたい処理はそのViewに任せる。」って考え方もありかなーって思いました。
     抽象的で申し訳ないですが、被る影響についてもう少し教えてもらえますか。

    キャンセル

  • 2018/01/29 16:15

    たとえば画面を破棄して再表示した場合でも古いデータが残ってしまうとかですねー。

    キャンセル

-1

Menu が View の中にあるなら RelativeSource で行けるんだろうと思いますが、省略しすぎてて情報が少なすぎるのでこれ以上は書けません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/16 22:29

    回答ありがとうございます。
    右クリックメニュー(ContextMenu)のようなものであれば、
    ご回答の通り相対指定(1つ上の階層)でいけるのではと理解しております。
    が、追記しました通り、MenuとViewは独立しており、難しいのではと考えています。

    キャンセル

  • 2018/01/16 22:41

    情報が少なすぎるので同意も否定もできません。

    キャンセル

  • 2018/01/16 22:46

    恐縮ですが、どのような情報が少なすぎるのか教えていただけますでしょうか。

    キャンセル

  • 2018/01/16 22:51

    これにコードを補ってコマンドを使うことはできます。
    しかしそれはあなたの現在のコードとかけ離れたものになるかもしれません。
    それくらい欠損しています。
    どのようなというレベルではなく全然何もかも足りません。

    キャンセル

  • 2018/01/17 19:48

    何を聞いても解決に繋がらない回答しか頂けなかったので、低評価を付けました。

    キャンセル

  • 2018/01/17 19:56 編集

    どうぞ。
    解決につながらなかったのは何度聞いても質問者がろくな情報を出さなかったからですが、それがわかるには時間がかかるでしょう。いや、わからないでしょうね。

    キャンセル

  • 2018/01/17 20:16

    一つの事実は、普通のまともな質問者なら三十分で解決している問題が、私だけではなく Tak1wa さんまで出てきて結局解決しなかったということです。

    キャンセル

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

  • ただいまの回答率 90.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Viewboxで外部XAMLの内容を描画したい。

    現在、C#とWPFを使用してデスクトップマスコットを制作しているのですがViewboxの中身を別のXAMLファイルに置き換えることはできないのでしょうか? <Viewbox>

  • 受付中

    wpf xaml frame

    ボタンが複数個あって、押したボタンに応じて遷移先が異なる挙動を実装したいです。 <Grid Grid.Row="1" Grid.Column="0"> <Frame Sourc

  • 解決済

    WPFで排他的に選択させる

    前提・実現したいこと 1.ボタンをデータにより動的に生成する 2.そのボタンをラジオボタンのように排他的に選択させたい(タッチ操作のためラジオボタンは避けたい) 3.選択中の

  • 解決済

    WPFのTabControlの挙動

    発生している問題・エラーメッセージ 下記ソースの画面をタブレットで操作中、tab2選択中にtab2の要素内で連続でタップ(3回くらい)すると tab1に切り替わってしまうという

  • 解決済

    ContextMenuのハイライト非表示

    前提・実現したいこと こんにちは WPFでボタン押すとContextMenuの中にカレンダーが表示され、 年月を選択できる物を作っています。 カレンダー選択まではう

  • 受付中

    WPFでawait Task.RunにしたらSTAエラーになっています

    こんにちは。  Windows10でWPFのアプリケーションを開発しています。  Visual Studio 2015 Communityを使っています。  前提・実現したいこ

  • 解決済

    CanvasにLineや円やTextBlockを描画するやり方

    ItemsControlを使ってCanvasにLineを書いています。CanvasにLineの他に円やTextBlockなど複数種類の図形を描画したい場合にはXAMLは どの様に書

  • 解決済

    WPFで映画のキャスト/スタッフ一覧みたいなスライドをしたい

    こんにちは。  Windows10でWPFのアプリケーションを開発しています。  Visual Studio 2017 Communityを使っています。  前提・実現したいこ

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

  • C#

    5794questions

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

  • WPF

    608questions

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

  • MVVM

    65questions

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