只要我继续使用一个窗口,一切都很简单.
现在我想用特定的viewmodel打开一个新窗口.
我有一个主viewmodel,它包含一个应该打开一个新的Window / viewmodel的Command,以及一个Parameter.
为了以MVVM方式执行此 *** 作,我创建了一个NavigationService,我想这样调用:
public MainWindowviewmodel() { DetailsCommand = new DelegateCommand(Details); } public voID Details() { Sessionsviewmodel sessions = new Sessionsviewmodel(); _NavigationService.CreateWindow(sessions); }
我注意到可以在XAML中“绑定”VIEws和viewmodel,如下所示:
<Application x:Class="TimeTracker.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:TimeTracker" xmlns:vm="clr-namespace:TimeTracker.viewmodels" xmlns:vw="clr-namespace:TimeTracker.VIEws" StartupUri="VIEws/MainWindow.xaml"> <Application.Resources> <ResourceDictionary> <DataTemplate DataType="{x:Type vm:MainWindowviewmodel}"> <vw:MainWindow /> </DataTemplate> <DataTemplate DataType="{x:Type vm:Sessionsviewmodel}"> <vw:Sessions /> </DataTemplate> </ResourceDictionary> </Application.Resources></Application><Window x:Class="TimeTracker.VIEws.Sessions" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/Expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:TimeTracker.VIEws" xmlns:vm="clr-namespace:TimeTracker.viewmodels" mc:Ignorable="d" title="Sessions" Height="300" WIDth="300"> <Window.DataContext> <vm:Sessionsviewmodel/> </Window.DataContext> <GrID> <TextBlock Text="Hallo" /> </GrID></Window>
我遇到的问题是我不知道如何在NavigationService中使用此ResourceDictionary,因此我只能使用其viewmodel创建一个新的Window.
class NavigationService{ public voID CreateWindow(Iviewmodel viewmodel) { //How do I create a new Window using the ResourceDictionary? }}解决方法 确保在新窗口中有ContentControl或ContentPresenter,以便可以显示viewmodel.接下来,确保资源字典在范围内.将它放在Application.Resources中将使其全局化并保证WPF可以找到DataTemplate.
另外,不要在DataTemplate中使用Window类作为视图.使用子窗口面板(例如,GrID,StackPanel等).
我这样做:
<blah:MyChilDWindow> <ContentControl Content={Binding DataContext}/></blah:MyChilDWindow>And in Application.Resources:<DataTemplate DataType={x:Type blah:Myviewmodel}> <blah:MyChilDWindow/></DataTemplate>
顺便说一句 – 使用DataTemplates你正在尝试的方式是一个很好的模式.
总结以上是内存溢出为你收集整理的c# – 创建没有MVVM框架的子窗口全部内容,希望文章能够帮你解决c# – 创建没有MVVM框架的子窗口所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)