Est-il possible d'ajouter un fichier de données à Silverlight DataForm sans créer un modèle d'édition entier?
-
19-09-2019 - |
Question
J'utilise le DataForm pour une entité avec environ 40 attributs. Je suis content de la façon dont la forme affiche tous, mais 3 des attributs. Ces 3 attributs se trouvent des listes d'éléments.
Je ne veux pas avoir à coder sur un modèle d'édition entier, semble très contre-productif.
<dataFormToolkit:DataForm AutoGenerateFields="True" CurrentItem="{Binding XXX, Mode=TwoWay, Source={StaticResource XXXViewModel}}" >
<dataFormToolkit:DataField Label="Client" >
<ListBox ItemsSource="{Binding Client}"></ListBox>
</dataFormToolkit:DataField>
</dataFormToolkit:DataForm>
La solution
WCF RIA Services de comprend un modèle de projet d'application métier Silverlight qui démontre la création d'un CustomDataForm où ils remplacent OnAutoGeneratingField
et modifier le champ uniquement pour les attributs que vous voulez. J'ai copié le code ici pour vous d'illustrer l'idée, mais je vous suggère de vérifier la chose réelle pour voir comment ils utilisent la méthode d'extension de ReplaceTextBox pour traiter la liaison de données aussi bien. .
public class CustomDataForm : DataForm
{
protected override void OnAutoGeneratingField(DataFormAutoGeneratingFieldEventArgs e)
{
// Get metadata about the property being defined
PropertyInfo propertyInfo = this.CurrentItem.GetType().GetProperty(e.PropertyName);
// Do the password field replacement if that is the case
if (e.Field.Content is TextBox && this.IsPasswordProperty(propertyInfo))
{
e.Field.ReplaceTextBox(new PasswordBox(), PasswordBox.PasswordProperty);
}
// Keep this newly generated field accessible through the Fields property
this.fields[e.PropertyName] = e.Field;
// Call base implementation (which will call other event listeners)
base.OnAutoGeneratingField(e);
}
}
Autres conseils
Il fonctionnera: essayer
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public class IsPassword : System.Attribute { }
public class CustomDataForm : DataForm
{
protected override void OnAutoGeneratingField(DataFormAutoGeneratingFieldEventArgs e)
{
// Get metadata about the property being defined
PropertyInfo propertyInfo = this.CurrentItem.GetType().GetProperty(e.PropertyName);
// Do the password field replacement if that is the case
var attributes = propertyInfo.GetCustomAttributes(typeof(IsPassword), false).ToList();
if (attributes.Any(obj=>obj is IsPassword))
{
PasswordBox box= new PasswordBox();
Binding binding = new Binding(e.PropertyName);
binding.Mode = BindingMode.TwoWay;
box.SetBinding(PasswordBox.PasswordProperty, binding);
e.Field.Content=box;
}
base.OnAutoGeneratingField(e);
}
}
puis ajoutez [IsPassword] à votre propriété
Je suis sûr que ce n'est pas possible. Si je vous, j'avalerait ma douleur et de créer ce modèle d'édition.
La seule alternative que je peux voir est de travailler avec les données de votre viewmodel et créer une classe distincte qui détient les 37 propriétés qui ont besoin d'aucun changement. Ensuite, vous faites une entité distincte pour les 3 qui ont besoin d'une attention particulière. De cette façon, vous pourriez avoir deux formes de données, un autogénérés et une coutume. Nous espérons que vous pouvez travailler avec eux styling afin qu'ils ressemblent à une forme. Beaucoup de travail, je sais, mais il pourrait être encore plus de travail pour créer le modèle complet d'édition.