rksoftware

Visual Studio とか C# とかが好きです

.NET Core 3 の WPF でもデザイナをあきらめない(ViewModel/DependencyInjection)

以前に .NET Core 3 の WPF でデザイナを使うために、XAML ファイルを .NetFramework プロジェクトで開くという力強い記事を書きました。 ViewModel は .NET Standard クラスライブラリを作るとスマートというスマートな記事も書きました。

ViewModel は SharedProject に作るという少し懐かしさを感じる記事も書きました。 その続編です。

■ スマートに ViewModel を設定したい

これまでの .NET Standard や SharedProject でも問題なく ViewModel を扱えましたが、どちらも僅かな制約や注意を要する点がある方法でした。今度は、制約や注意点のないシンプルな方法を考えてみます。

■ ViewModel のインタフェースを作る

これまで ViewModel は直接実装を扱っていましたが、インタフェースを定義して、View はこのインタフェースに依存するようにします。このインタフェースだけをリンクで共有すれば、シンプルな依存になって制約や注意点がなくなるはずです。


※今回は DI コンテナとして Unity コンテナを使っています。

ViewModel のインタフェース IMainWindowViewModel

ViewModel のインタフェースです。

using System.ComponentModel;

namespace WpfAppNetCore
{
    interface IMainWindowViewModel : INotifyPropertyChanged
    {
    }
}

ViewModel の実装クラス MainWindowViewModel

namespace WpfAppNetCore
{
    class MainWindowViewModel : BindingBase, IMainWindowViewModel
    {
    }
}

■ DI で ViewModel をセット

DI というか、このコードでは ServiceLocator になっていますが。

using System.Windows;
using Unity;

namespace WpfAppNetCore
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = DIContainerHolder.Conatiner.Resolve<IMainWindowViewModel>();
        }
    }
}

コードビハインドで、ViewModel をセットすることに賛否あると思いますが、ここから更に進むことができる道もあると思いますし、アイデアのネタの一つとして受け止めてもらえるとありがたいです。

■ 動作

非常にシンプルで、扱いやすいプロジェクトになりました。やっぱり DI ですね。
f:id:rksoftware:20190324153117j:plain

□ .NET Core 3 の WPF でもデザイナをあきらめない記事シリーズの目次