c# - ejemplos - MĂșltiples formularios de entrada con el mismo archivo xaml y diferentes DataContexts
xaml tutorial (1)
Estoy desarrollando una aplicación WinRT usando XAML y MVVM Light. Esta aplicación está diseñada para facilitar la recopilación de datos mientras los usuarios están fuera del campo. Tengo una sección de mi aplicación en la que los usuarios deberán ingresar un montón de información sobre varios elementos diferentes. Estos elementos se definen como clases que heredan de una clase GenericAsset
. El GenericAsset
tiene campos como este:
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; }
}
Y las subclases se ven más o menos así:
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; }
}
Actualmente tengo 15 SubAssets (y tendré muchos más en el futuro) y estoy buscando una forma de crear una vista de entrada de datos / modelo de vista (si es posible) para no tener que crear una vista separada para cada activo. Además, si puedo obtener el funcionamiento del view / view / view genérico, ¿cómo voy a cargar los controles de entrada de datos personalizados (las entradas específicas para cada sub activo) mientras mantengo el enlace de datos bidireccional correcto con el sub activo apropiado?
Lo que estás buscando es un DataTemplateSelector
. Cree un DataTemplate
diferente para cada SubAsset
. A continuación, muestre el Asset
través de ContentControl
(o ListView
en el caso de varios de ellos). Ambos tienen una ranura para un DataTemplateSelector
( ContentTemplateSelector
y ItemTemplateSelector
, respectivamente). Si hay partes que son similares entre ellos, puede componer un DataTemplate
con otro utilizando un ContentControl
interno que apunta al DataTemplate
destino (que desea componer).
Para agregar sus DataTemplate
desde diferentes ResourceDictionaries
, cuando cree su DataTemplateSelector
, cree una propiedad para cada DataTemplate
que desee tener.
Tu selector puede verse más o menos así:
public class AssetDataTemplateSelector : DataTemplateSelector
{
public DataTemplate SubAsset1DataTemplate { get; set; }
public DataTemplate SubAsset2DataTemplate { get; set; }
...
// Data Template Selection Code
...
}
Luego, en un ResourceDictionary (como Generic.xaml), cuando declaras AssetDataTemplateSelector
, simplemente AssetDataTemplateSelector
referencia a todas las otras DataTemplates
como 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}"
...
/>