ãã¿ã³ãªã©ã® GUI ã¤ãã³ããå®è¡ããã¨ãã«ãã¡ã¤ã³ã¦ã£ã³ãã¦ã®ã¤ã³ã¹ã¿ã³ã¹ï¼ãã³ãã«ï¼ã欲ãããã¨ãããã¾ãã
æ¬æ¥ãMVVM ã§è¨è¨ãããã¨ãããããã¨ã¯ç¡ãããã«è¨è¨ããã®ããããã¾ããããç¾å®çã« VM ããåã¦ã£ã³ãã¦ãï¼è¦ªã¦ã£ã³ãã¦ã®ï¼ãã¤ã¢ãã°ã¨ãã¦è¡¨ç¤ºããããã®ãããªãã¨ãããã¯ãµã¯ãã¨å®è£ ãããããã¾ãåçååã大åã«ãããã¦ããView ã¯ã©ãã¾ã§ãã£ã¦ã XAML ãªã®ã§æ·±ãä»ãåã£ã¦ãã©ããªã®ããªãã¨ããæ°æã¡ã¯ããã
WindowService ã®å©ç¨
ã¨ãããã㧠WindowService
ãå®è£
ä¾ãã¦ã£ã³ãã¦ã®ã¤ã³ã¹ã¿ã³ã¹ã渡ãã¨ã¤ã³ã¿ã¼ãã§ã¼ã¹çµç±ã§ã¦ã£ã³ãã¦ï¼ã§ãããããã¨ï¼ãæä½ã§ããã
ã¦ã£ã³ãã¦ã®ã¤ã³ã¹ã¿ã³ã¹ãã®ãã®ã渡ãã¦ãã¾ã£ã¦ããããã ãã©ããããã« MVVM ã®çæã«æãæ°ãããã®ã§ãã¤ã³ã¿ã¼ãã§ã¼ã¹ã§ã©ãããã¦ããããã¨ããææ¡ãæ ¹æ¬ããªã®ã§ Window
ã¤ã³ã¹ã¿ã³ã¹ãè¿å´ãã¦ãã¾ãã®ã¯å¾®å¦ã¨ãæãããåã¦ã£ã³ãã¦ãè¿å´ããã¡ã½ããã«ç½®ãæãã¦ãããã¨æãã
public interface IWindowService { Window Window { get; } IntPtr WindowHandle { get; } void Close(); }
public class WindowService : IWindowService { private readonly Window _window; public Window Window => _window; public IntPtr WindowHandle => new System.Windows.Interop.WindowInteropHelper(_window).Handle; /// <summary> /// <see cref="WindowService"/> ã¯ã©ã¹ã®æ°ããã¤ã³ã¹ã¿ã³ã¹ãåæåãã¾ãã /// </summary> /// <param name="window">ã¦ã£ã³ãã¦ã®ã¤ã³ã¹ã¿ã³ã¹ã</param> public WindowService(Window window) { if (window == null) { throw new ArgumentNullException(nameof(window)); } _window = window; // WindowHandle ã®ã¢ãã¬ã¹å¤ã¯ãWindow ã®é表示åã 㨠0x00 ãè¿å´ãããã // Window 表示å¾ã®ãã¿ã³æ¼ä¸ã®ã¿ã¤ãã³ã°ãªã©ã§åå¾ããããã¨ãæã¾ãã } public void Close() => _window.Close(); }
使ãæ¹
DI ã¨é£æºãããã¨ããããªæãã«ãªãã¨æãã
protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); var serviceCollection = new ServiceCollection(); var messenger = WeakReferenceMessenger.Default; var v = new MainWindow(); ConfigureServices(serviceCollection, v); var serviceProvider = serviceCollection.BuildServiceProvider(); var vm = new MainWindowViewModel(messenger, serviceProvider); v.DataContext = vm; v.Show(); } private void ConfigureServices(IServiceCollection services, MainWindow v) { // DIã³ã³ããã«ãµã¼ãã¹ãç»é² services.AddSingleton<IWindowService>(new WindowService(v)); }
... public MainWindowViewModel(IMessenger messenger, IServiceProvider serviceProvider) { _messenger = messenger; _serviceProvider = serviceProvider; } public void ShowChildWindow() { var windowService = _serviceProvider.GetRequiredService<IWindowService>(); var v = new SampleWindow { Owner = windowService.Window, WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner, }; var childWindowService = new WindowService(v); var vm = new SampleWindowViewModel(childWindowService); v.DataContext = vm; v.ShowDialog(); }
ãã¤ã³ã
ViewModel 㧠View ãå¼ãã®ã¯ãã¾ãæ¨å¥¨ããããã¨ã§ã¯ãªãããªã®ã§ãã¢ã¯ã»ã¹ã§ããé¨åãéå®ããããã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ã
ã§ãã使ãããã·ã¼ã³ãããã¨ãã¯ï¼
- DI ã§ã¦ã£ã³ãã¦ã®ã¤ã³ã¹ã¿ã³ã¹ã管ç
- 管çãããããã¢ã¯ã»ã¹ãããã
- åã¦ã£ã³ãã¦ã«ã転ç¨ãå¿ç¨ãããã