具有相同xaml文件和不同DataContexts的多个输入表单

Mal*_*rus 5 c# xaml mvvm-light windows-runtime winrt-xaml

我正在使用XAML和MVVM Light开发WinRT应用程序.这个应用程序旨在使用户在外地时更容易进行数据收集.我有一个应用程序的部分,用户需要输入一些有关几个不同项目的信息.这些项定义为从GenericAsset类继承的类.在GenericAsset具有诸如这样的:

public class GenericAsset
{
    public string AssetId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Make { get; set; }
    public string Model { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

子类看起来像这样:

public class SubAsset1 : GenericAsset
{
    public string RecordNumber { get; set; }
    public int SizeDiameter { get; set; }
    public string MaterialType { get; set; }
}

public class SubAsset2 : GenericAsset
{
    public string Type { get; set; }
    public int Size { get; set; }
    public string PlanRef { get; set; }
    public string InteriorMaterial { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

目前我有15个SubAssets(并且将来还会有更多),我正在寻找一种方法来创建一个数据输入视图/ viewmodel(如果可能的话),这样我就不必为每个资产创建一个单独的视图.此外,如果我可以使通用视图/视图模型工作,我将如何加载自定义数据输入控件(特定于每个子资产的输入),同时保持适当的双向数据绑定到适当的子资产?

Nat*_*ond 1

您正在寻找的是一个DataTemplateSelector. DataTemplate为每个创建不同的SubAsset. 然后,显示Assetvia a ContentControl(或者ListView在有多个的情况下)。它们都有一个分别用于DataTemplateSelector(ContentTemplateSelectorItemTemplateSelector) 的插槽。如果它们之间存在相似的部分,您实际上可以DataTemplate通过使用ContentControl指向目标DataTemplate(您希望组合)的内部指向来将一个部分与另一个部分组合。

为了添加DataTemplate来自不同的 s ResourceDictionaries,当您创建s 时DataTemplateSelector,请为DataTemplate您希望拥有的每个属性创建一个属性。

你的选择器可能看起来像这样:

public class AssetDataTemplateSelector : DataTemplateSelector
{
    public DataTemplate SubAsset1DataTemplate { get; set; }
    public DataTemplate SubAsset2DataTemplate { get; set; }
    ...

    // Data Template Selection Code
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后在 ResourceDictionary(例如 Generic.xaml)中,当您声明您的 时AssetDataTemplateSelector,只需将所有其他项引用DataTemplatesStaticResources 即可。

<!-- This assumes that AssetDataTemplateSelector has been declared in a namespace 
     defined in the root of the ResourceDictionary as 'converters'. -->
<!-- It also assumes that you have created DataTemplates with the names 
     SubAssetXDataTemplate either in the same or other ResourceDictionaries 
     which are accessible from this one. -->
<converters:AssetDataTemplateSelector x:Key="AssetDataTemplateSelector"
                                      SubAsset1DataTemplate="{StaticResource SubAsset1DataTemplate}"
                                      SubAsset2DataTemplate="{StaticResource SubAsset2DataTemplate}"
                                      ...
                                      />
Run Code Online (Sandbox Code Playgroud)