我正在使用 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 个子 Assets (将来会有更多),我正在寻找一种方法来创建一个数据输入 View / View 模型(如果可能的话),这样我就不必为每项 Assets 。此外,如果我能让通用 View / View 模型正常工作,我将如何加载自定义数据输入控件(特定于每个子 Assets 的输入),同时保持适当的双向数据绑定(bind)到适当的子 Assets ?
最佳答案
您正在寻找的是 DataTemplateSelector
。为每个 SubAsset
创建一个不同的 DataTemplate
。然后,通过 ContentControl
(或 ListView
,如果有多个)显示 Asset
。它们都有一个用于 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}"
...
/>
关于c# - 具有相同 xaml 文件和不同 DataContext 的多个输入表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24121205/