使用MVVM Light工具包显示对话框

Tej*_*ash 19 dialog mvvm mvvm-light

我有一个ViewModel需要ShowDialog()在按钮点击时显示模态窗口(使用).ViewModel捕获click命令,但我不希望window.ShowDialog()在我的ViewModel中执行.我知道DialogMessageMVVM Light中有一个,但它用于显示消息框,而不是WPF模式窗口.

关于如何做到这一点的任何想法?

Raf*_*jer 20

你应该使用Messenger课程.在View注册表上显示一个消息窗口然后当你需要显示它时调用类的Send方法Messenger.

你可以这样做:

//do this in code behind file of your View
Messenger.Default.Register<string>(this, ShowWindow);

private void ShowWindow(string message)
{
    // your logic here
}

// In the ViewModel
Messenger.Default.Send(“Some text”);
Run Code Online (Sandbox Code Playgroud)


bug*_*d87 11

这是我用于MVVM-Light Toolkit的自定义对话框.

首先,在应用程序的某处定义这四个类.MessageBase类是工具包的一部分.

public class ShowChildWindowMessage : MessageBase { }
public class HideChildWindowMessage : MessageBase { }
public class DisplaySomeContentMessage : MessageBase { }
public class DisplaySomeOtherContentMessage : MessageBase { }
Run Code Online (Sandbox Code Playgroud)

其次,你需要一个"子"窗口控件.使用以下内容创建XAML文件:

<Window x:Class="ChildWindowView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    DataContext="{Binding Path=ChildWindowBinding, Source={StaticResource Locator}}"
    Title="{Binding Path=CurrentContent.DisplayName}"
    MinWidth="300" MinHeight="125" SizeToContent="WidthAndHeight"
    ShowInTaskbar="False" WindowState="Normal" ResizeMode="NoResize"
    WindowStartupLocation="CenterOwner" SnapsToDevicePixels="True">

<Grid>
    <ContentPresenter Content="{Binding Path=CurrentContent}" />
</Grid>
Run Code Online (Sandbox Code Playgroud)

然后将以下内容添加到此XAML文件的代码隐藏中:

public partial class ChildWindowView : Window
{
    public ChildWindowView(Window owner)
    {
        InitializeComponent();
        Owner = owner;

        Closing += (s, e) => 
        {
            // window reused so just hide
            e.Cancel = true;
            Messenger.Default.Send(new HideChildWindowMessage());
        };
    }

}
Run Code Online (Sandbox Code Playgroud)

第三,将以下内容添加到MainWindow.xaml文件的代码隐藏中:

public partial class MainWindowView : Window
{
    private ChildWindowView m_childWindowView;

    public MainWindowView()
    {
        InitializeComponent();
        Closing += (s, e) => ViewModelLocator.CleanUp();
        Loaded += (s, e) =>
        {
            m_childWindowView = new ChildWindowView(this);
        };

        Messenger.Default.Register<ShowChildWindowMessage>(this, (msg) => m_childWindowView.ShowDialog());
        Messenger.Default.Register<HideChildWindowMessage>(this, (msg) => m_childWindowView.Hide());
    }
}
Run Code Online (Sandbox Code Playgroud)

第四,定义以下视图模型:

public class ChildWindowVM : ViewModelBase
{
    private ViewModelBase m_currentContent;
    public ViewModelBase CurrentContent
    {
        get { return m_currentContent; }
        set
        {
            m_currentContent = value;
            RaisePropertyChanged("CurrentContent");

            if (m_currentContent != null)
            {
                Messenger.Default.Send(new ShowChildWindowMessage());
            }
        }
    }

    public ChildWindowVM()
    {
        Messenger.Default.Register<DisplaySomeContentMessage>(this, (msg) => CurrentContent = ViewModelLocator.SomeContentVm);
        Messenger.Default.Register<DisplaySomeOtherContentMessage>(this, (msg) => CurrentContent = ViewModelLocator.SomeOtherContentVm);
    }
}
Run Code Online (Sandbox Code Playgroud)

第五,为要在自定义对话框中显示的内容创建XAML文件和视图模型.在此示例中,我的内容视图模型名为SomeContent和SomeOtherContent.当然,你可以用你想要的东西取而代之.

最后,为了使其工作,您必须通过将以下内容添加到应用程序资源,将内容视图模型绑定到各自的XAML文件:

<DataTemplate DataType="{x:Type viewmodels:SomeContentVM}">
    <views:SomeContentView/>
</DataTemplate>

<DataTemplate DataType="{x:Type viewmodels:SomeOtherContentVM}">
    <views:SomeOtherContentView/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

现在,一旦完成所有这些设置,就可以非常轻松地添加可以在子窗口中显示的新内容(XAML和视图模型).要显示内容,只需使用Messenger类调用相应的消息:

Messenger.Default.Send(new DisplaySomeContentMessage ());
Run Code Online (Sandbox Code Playgroud)

如果我需要为您澄清这方面的任何部分,请告诉我.