C#プログラミング

【C#】ViewModelからViewへアクセスする方法【MVVM】

ViewModelからViewを操作する方法記事のアイキャッチ C#

本記事ではViewModelからViewへアクセスする方法を紹介します。基本的に表示の更新はbindingで事足りますが、Viewに動的にコントロールを配置したい状況が発生した場合に役立ちます。

スポンサーリンク

ViewModelからViewを操作できるプロジェクト作成手順

今回作成するプロジェクト名は「MVVM_AccessibleView」です。

MVVMプロジェクトを作成する

まずはベースとなるMVVMプロジェクトを用意します。

MVVMプロジェクトの作り方はこちらの記事にありますので必要があれが参照ください。

App.xamlを編集する

VisualStudio上ソリューションエクスプローラからApp.xamlファイルを開き、<Application/>内の
「StartupUri=”Views¥MainView.xaml”」を削除します。

これを消さないと最終的に2つウィンドが立ち上がってしまいます

App.xaml.csを編集する

本ファイルにてアプリ起動時の動作を記述しています。

一例ですが今回は以下のように編集しました。

using System;
using System.Windows;
using MVVM_AccessibleView.Views;
using MVVM_AccessibleView.ViewModels;

namespace MVVM_AccessibleView
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            try
            {
                base.OnStartup(e);

                var v = new MainView();
                var vm = new MainViewModel();

                vm.myMainView = v;
                v.DataContext = vm;
                //ウィンドの表示
                v.Show();
            }
            catch
            {
                //起動時にエラーがあるとここに来る
                Console.WriteLine("エラー in App.xaml.cs");
            }
        }
    }
}

重要なところを色を付けて目立たせています。

Viewのxaml.csを編集する

View(xaml.cs)の元の役割は上記App.xaml.csが行ってくれるので、以下2行を削除します。

public partial class MainView : Window
    {
        public MainView()
        {
            InitializeComponent();

            //MainViewModel vm = new MainViewModel();  ←不要なので削除
            //this.DataContext = vm;                     ←不要なので削除
        }
    }

ViewModelにてViewを生成

MainViewModel.csにてViewの変数を宣言する。

namespace MVVM_AccessibleView.ViewModels
{
    public class MainViewModel : INotifyPropertyChanged
    {
        //Viewの作成
        public MainView myMainView;
        
        (---    以下略    ---)

以上でViewModelからViewを操作するための設定が完了しました。

スポンサーリンク

ViewModelからViewを操作してみる

試しにコントロール(Rectangle)をViewModelから配置します。

Viewのxamlには、<Canvas Name=”ViewCnvs”>を配置します。

ViewModelには、ボタンを押すとCanvasにRectangleを配置するコマンドを記載します。

private void Button1_cmd()
        {
            //Viewに追加する四角を作成
            Rectangle rect = new Rectangle();
            rect.Width = rect.Height = 30;
            rect.Fill = Brushes.Blue;
            
      //View(Canvas)に追加する
            myMainView.ViewCnvs.Children.Add(rect);
        }

ソフトの動作は以下の通り。

ソフト実行時の様子

Canvasに青四角が配置されました。

スポンサーリンク

さいごに

ViewModelで算出した座標などを用いてViewにコントロールを配置する際などに重宝します。
Viewが動的に動くソフトは見ていて楽しいので作りがいがありますね。

GUI関連でMVVMでグラフを描画する方法の紹介記事もあります↓

コメント

タイトルとURLをコピーしました