具有相同 xaml 文件和不同数据上下文的多个输入表单

本文关键字:上下文 输入 数据 表单 xaml 文件 | 更新日期: 2023-09-27 18:07:33

我正在使用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; }
}

子类看起来像这样:

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; }
}

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

具有相同 xaml 文件和不同数据上下文的多个输入表单

你要找的是一个DataTemplateSelector。为每个SubAsset创建不同的DataTemplate。然后,通过ContentControl显示Asset(如果是多个,则为ListView(。他们都有一个DataTemplateSelector的插槽(分别为ContentTemplateSelectorItemTemplateSelector(。如果它们之间存在相似的部分,则实际上可以通过使用指向目标DataTemplate(您希望组合(的内部ContentControl来将一个DataTemplate与另一个组成。

为了添加来自不同ResourceDictionariesDataTemplate,当你创建DataTemplateSelector时,为每个DataTemplate创建一个属性。

您的选择器可能如下所示:

public class AssetDataTemplateSelector : DataTemplateSelector
{
    public DataTemplate SubAsset1DataTemplate { get; set; }
    public DataTemplate SubAsset2DataTemplate { get; set; }
    ...
    // Data Template Selection Code
    ...
}

然后在 ResourceDictionary(如 Generic.xaml(中,当您声明AssetDataTemplateSelector时,只需将所有其他DataTemplates称为 StaticResource s。

<!-- 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}"
                                      ...
                                      />