How to build a generic/re-usable modal dialog for WPF following MVVM

前端 未结 2 1008
心在旅途
心在旅途 2020-12-30 08:31

I would like to build a generic/re-usable modal dialog that I can use in our WPF (MVVM) - WCF LOB application.

I have a Views and associated ViewModels that I would

2条回答
  •  攒了一身酷
    2020-12-30 09:19

    I usually deal with this by injecting this interface into the appropriate ViewModels:

    public interface IWindow
    {
        void Close();
    
        IWindow CreateChild(object viewModel);
    
        void Show();
    
        bool? ShowDialog();
    }
    

    This allows the ViewModels to spaw child windows and show them modally on modeless.

    A reusable implementation of IWindow is this:

    public class WindowAdapter : IWindow
    {
        private readonly Window wpfWindow;
    
        public WindowAdapter(Window wpfWindow)
        {
            if (wpfWindow == null)
            {
                throw new ArgumentNullException("window");
            }
    
            this.wpfWindow = wpfWindow;
        }
    
        #region IWindow Members
    
        public virtual void Close()
        {
            this.wpfWindow.Close();
        }
    
        public virtual IWindow CreateChild(object viewModel)
        {
            var cw = new ContentWindow();
            cw.Owner = this.wpfWindow;
            cw.DataContext = viewModel;
            WindowAdapter.ConfigureBehavior(cw);
    
            return new WindowAdapter(cw);
        }
    
        public virtual void Show()
        {
            this.wpfWindow.Show();
        }
    
        public virtual bool? ShowDialog()
        {
            return this.wpfWindow.ShowDialog();
        }
    
        #endregion
    
        protected Window WpfWindow
        {
            get { return this.wpfWindow; }
        }
    
        private static void ConfigureBehavior(ContentWindow cw)
        {
            cw.WindowStartupLocation = WindowStartupLocation.CenterOwner;
            cw.CommandBindings.Add(new CommandBinding(PresentationCommands.Accept, (sender, e) => cw.DialogResult = true));
        }
    }
    

    You can use this Window as a reusable host window. There's no code-behind:

    
        
            
                
            
        
        
    
    

    You can read more about this (as well as download the full code sample) in my book.

提交回复
热议问题