Silverlight 4 Redéfinition de la DataForm Autogénérer pour insérer les zones combinées liées à Converters

StackOverflow https://stackoverflow.com/questions/2557951

Question

Je travaille à trouver une solution pendant un certain temps et pourrait utiliser un peu d'aide. Je sais que je l'ai vu un exemple de cela, mais ce soir, je ne trouve rien à ce que je dois.

J'ai un service qui me donne tous mes DropDownLists, que ce soit à partir du cache ou du DomainService. Ils sont présentés comme IEnumerable et sont demandés à partir du référentiel avec GetLookup (LookupId).

J'ai créé un attribut personnalisé que j'ai décoré mon MetaDataClass qui ressemble à ceci:

[Lookup(Lookup.Products)]
public Guid ProductId

J'ai créé un formulaire de données personnalisé qui est réglé sur AutoGenerateFields et j'intercepter les champs AutoGenerate.

Je vérifie mon CustomAttribute et qui fonctionne.

Compte tenu de ce code dans mon CustomDataForm (commentaires standards supprimés par souci de concision), quelle est l'étape suivante pour remplacer la génération de champ et placez un combobox lié à sa place?

public class CustomDataForm : DataForm
{
    private Dictionary<string, DataField> fields = new Dictionary<string, DataField>();

    public Dictionary<string, DataField> Fields
    {
        get { return this.fields; }
    }

    protected override void OnAutoGeneratingField(DataFormAutoGeneratingFieldEventArgs e)
    {
        PropertyInfo propertyInfo = this.CurrentItem.GetType().GetProperty(e.PropertyName);

        foreach (Attribute attribute in propertyInfo.GetCustomAttributes(true))
        {
            LookupFieldAttribute lookupFieldAttribute = attribute as LookupFieldAttribute;
            if (lookupFieldAttribute != null)
            {                    
                //   Create a combo box.
                //   Bind it to my Lookup IEnumerable
                //   Set the selected item to my Field's Value
                //   Set the binding two way
            }
        }
        this.fields[e.PropertyName] = e.Field;
        base.OnAutoGeneratingField(e);
    }
}

Tous ont cité des exemples de travail pour SL4 / VS2010 serait apprécié.

Merci

Mise à jour - Voici où je suis à. Je reçois mon combo maintenant, mais il est toujours vide même si ItemsSource est pas.

if (lookupFieldAttribute != null)
{
    ComboBox comboBox = new ComboBox();
    Binding newBinding = e.Field.Content.GetBindingExpression(TextBox.TextProperty).ParentBinding.CreateCopy();
    newBinding.Mode = BindingMode.TwoWay;
    newBinding.Converter = new LookupConverter(lookupRepository);
    newBinding.ConverterParameter = lookupFieldAttribute.Lookup.ToString();
    comboBox.SetBinding(ComboBox.SelectedItemProperty,newBinding);
    comboBox.ItemsSource = lookupRepository.GetLookup(lookupFieldAttribute.Lookup);                    
    e.Field.Content = comboBox;                    
}
Était-ce utile?

La solution

J'ai trouvé une solution.

if (lookupFieldAttribute != null)
{
    ComboBox comboBox = new ComboBox();
    Binding newBinding = e.Field.Content.GetBindingExpression(TextBox.TextProperty).ParentBinding.CreateCopy();
    var itemsSource = lookupRepository.GetLookup(lookupFieldAttribute.Lookup);
    var itemsSourceBinding = new Binding { Source = itemsSource };
    comboBox.SetBinding(ItemsControl.ItemsSourceProperty, itemsSourceBinding);
    newBinding.Mode = BindingMode.TwoWay;
    newBinding.Converter = new LookupConverter(lookupRepository);
    newBinding.ConverterParameter = lookupFieldAttribute.Lookup.ToString();
    comboBox.SetBinding(ComboBox.SelectedItemProperty,newBinding);
    e.Field.Content = comboBox;                    
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top