gpt4 book ai didi

xaml - 哪些代码作为 XAML 设计时的一部分执行?在 Visual Studio 和 Blend 中

转载 作者:行者123 更新时间:2023-12-04 19:09:44 28 4
gpt4 key购买 nike

作为一些背景知识,我正在使用共享单个 ViewModel (PCL) 的 Windows Store 应用程序和 Windows Phone 8 应用程序。

我正在使用 MVVMLight 和 NInject/Common Service Locator 来实例化 View 模型和服务。这很棒,给了我非常好的松散耦合,非常适合测试等等。

然而,获得设计时数据支持(通过切换到不同的 NInject 模块等)是一个完整的黑盒,虽然我现在可以使用它,但我对它不是很满意,它主要是通过反复试验。

我正在使用 ViewModelLocator 的标准做法(实例化为应用程序资源)从服务定位器中提取 View 模型。这总是被执行。

问题是,我不知道设计时编辑器实际执行了多少代码。因此,为了确保初始化 NInject 并将 CSL 连接到 NInject,我必须在 ViewModelLocator 上有一个静态构造函数。调用我的App类启动 NInject。

这对我来说似乎是错误的。所以真的,我想知道最好的做法是什么,如果在设计时显示应用程序的哪些部分是“启动”的,是否真的有任何文档/保证,以及两者之间是否不同Windows 应用商店应用和 Windows Phone 8 应用。

ViewModelLocator.cs(片段)

public class ViewModelLocator
{
static ViewModelLocator()
{
System.Diagnostics.Debug.WriteLine("VML Start");
var servicelocator = new NinjectServiceLocator(App.Kernel);
ServiceLocator.SetLocatorProvider(() => servicelocator);
System.Diagnostics.Debug.WriteLine("VML End");
}

public AppViewModel AppViewModel
{
get { return ServiceLocator.Current.GetInstance<AppViewModel>(); }
}

public MainViewModel MainViewModel
{
get { return ServiceLocator.Current.GetInstance<MainViewModel>(); }
}
}

App.xaml.cs(片段)
partial class App : Application
{
public static StandardKernel Kernel { private set; get; }

static App()
{
// Register dependencies & hook the service locator to use NInject under the hood
var servicemodule = ViewModelBase.IsInDesignModeStatic ? (NinjectModule)new DesignTimeModule() : new RunTimeModule();
var viewmodelmodule = new ViewModelModule();
App.Kernel = new StandardKernel(servicemodule, viewmodelmodule);
}
}

App.xaml(片段)
<?xml version="1.0" encoding="utf-8"?>
<Application RequestedTheme="Dark"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="KieranBenton.LeaveNow.App.App"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:app="using:KieranBenton.LeaveNow.App"
xmlns:dependencies="using:KieranBenton.LeaveNow.App.Dependencies"
mc:Ignorable="d">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
...
</ResourceDictionary.MergedDictionaries>
<dependencies:ViewModelLocator x:Key="ViewModelLocator"
d:IsDataSource="True" />
</ResourceDictionary>
</Application.Resources>
</Application>

Main.xaml
<tcdcontrols:LayoutAwarePage x:Name="pageRoot"
x:Class="KieranBenton.LeaveNow.App.Pages.Main"
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:tcdcontrols="using:TCD.Controls"
xmlns:vm="using:KieranBenton.LeaveNow.ViewModel"
mc:Ignorable="d"
DataContext="{Binding MainViewModel, Source={StaticResource ViewModelLocator}}">
<Page.Resources>
<!-- Collection of grouped items displayed by this page, bound to a subset of the complete item list because items in groups cannot be virtualized -->
<!-- NOTE: Ridiculous lengths to get this working - see http://www.ralbu.com/post/2012/11/18/Building-WinRT-Windows-8-Grouped-items-using-MVVMLight.aspx -->
<CollectionViewSource x:Name="groupedItemsViewSource"
Source="{Binding Journeys}"
d:Source="{Binding Journeys, Source={d:DesignInstance Type=vm:Main, IsDesignTimeCreatable=True}}"
IsSourceGrouped="true"
ItemsPath="Routes" />
</Page.Resources>

最佳答案

设计时编辑器应该只实例化您正在编辑的页面并执行在执行此操作时调用的任何代码:

  • 它解析并实例化其中的所有内容,包括您定义的任何资源
  • 它执行页面构造函数
  • 只要您“触摸”该类(它的静态成员或实例化它),任何静态构造函数都会被调用并初始化静态字段

  • 你没有说你想如何实例化你的 ViewModelLocator并在尝试让设计器工作之前初始化 Ninject。因此很难给出如何解决这个问题的建议。

    作为设计时数据的一般建议,我建议您坚持使用 DesignInstance markup它适用于 Windows 应用商店应用程序和 Windows Phone 8。您只需添加设计时间 DataContext给您的 Page标记:
    <Page xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    d:DataContext="{d:DesignInstance viewModels:PageViewModel, IsDesignTimeCreatable=True}">

    关于xaml - 哪些代码作为 XAML 设计时的一部分执行?在 Visual Studio 和 Blend 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16317512/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com