【发布时间】:2018-03-13 03:33:58
【问题描述】:
我正在努力获得 Laurent Bugnion 在他的一些视频中谈到的良好设计时体验。这是一个Win7机器上VS2017社区中的WPF应用程序。
在窗口中,FRAME 控件绑定到 URI。 Source="{Binding FrameUri, Mode=TwoWay}" 该程序在运行时工作,但在设计时,我有以下链接指向显示在框架中的 URL(参见第一张图片)。
需要指出的是,MainPage 有它的 MainViewModel,而 IntroPage 也有它自己的视图模型 (IntroViewModel)。
运行时图像
我猜 Intro Page 没有在设计时实例化,但不知道该怎么做。我尝试将设计时间线添加到 Frame xaml,但这不起作用:d:DataContext="{d:DesignInstance viewModels:PageViewModel, IsDesignTimeCreatable=True}"
我也尝试在 XAML 中添加 Path= IntroPageViewModel,但也没有用。
我这里有程序的代码:https://github.com/floppydisk525/MvvmLight_WPF_Frame_Nav/tree/NavTest
代码如下:
APP.XAML 文件
<Application.Resources>
<!--Global View Model Locator-->
<vm:ViewModelLocator x:Key="Locator"
d:IsDataSource="True" />
<DataTemplate DataType="{x:Type vm:IntroViewModel}">
<v:IntroPage/>
</DataTemplate>
</Application.Resources>
</Application>
帧代码:
<Frame x:Name="MainFrameDS" Source="{Binding FrameUri, Mode=TwoWay}" HorizontalAlignment="Left" Height="211" Margin="109,88,0,0" VerticalAlignment="Top" Width="258"/>
帧 URI 属性:
public const string FrameUriPropertyName = "FrameUri";
private Uri _frameUri;
/// <summary>
/// Sets and gets the FrameUri property.
/// Changes to that property's value raise the PropertyChanged event.
/// </summary>
public Uri FrameUri
{
get
{
return _frameUri;
}
set
{
Set(FrameUriPropertyName, ref _frameUri, value);
System.Diagnostics.Debug.WriteLine(_frameUri.ToString(), "_frameUri");
System.Diagnostics.Debug.WriteLine(FrameUri.ToString(), "FrameUri");
}
}
来自 ViewModelLocator
public class ViewModelLocator
{
public static readonly Uri IntroPageUri = new Uri("/IntroPage.xaml", UriKind.Relative);
public static readonly Uri MiddlePageUri = new Uri("/MiddlePage.xaml", UriKind.Relative);
public static readonly Uri LastPageUri = new Uri("/LastPage.xaml", UriKind.Relative);
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
if (ViewModelBase.IsInDesignModeStatic)
{
SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
}
else
{
SimpleIoc.Default.Register<IDataService, DataService>();
}
var NavigationService = new NavigationService();
SimpleIoc.Default.Register<INavigationService, NavigationService>();
SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<IntroViewModel>();
SimpleIoc.Default.Register<MiddleViewModel>();
SimpleIoc.Default.Register<LastViewModel>();
`#if DEBUG
if (ViewModelBase.IsInDesignModeStatic)
{
var instance = SimpleIoc.Default.GetInstance<IntroViewModel>();
}
`#endif
}
【问题讨论】:
标签: c# wpf mvvm-light