具有相同 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 个子资产(将来还会有更多(,我正在寻找一种创建一个数据输入视图/视图模型的方法(如果可能(,这样我就不必为每个资产创建单独的视图。此外,如果我可以让通用视图/视图模型工作,我将如何加载自定义数据输入控件(特定于每个子资产的输入(,同时保持与相应子资产的正确双向数据绑定?
你要找的是一个DataTemplateSelector
。为每个SubAsset
创建不同的DataTemplate
。然后,通过ContentControl
显示Asset
(如果是多个,则为ListView
(。他们都有一个DataTemplateSelector
的插槽(分别为ContentTemplateSelector
和ItemTemplateSelector
(。如果它们之间存在相似的部分,则实际上可以通过使用指向目标DataTemplate
(您希望组合(的内部ContentControl
来将一个DataTemplate
与另一个组成。
为了添加来自不同ResourceDictionaries
的DataTemplate
,当你创建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}"
...
/>