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)
如果我需要为您澄清这方面的任何部分,请告诉我.
| 归档时间: |
|
| 查看次数: |
19459 次 |
| 最近记录: |