以前に .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 ですね。