Silverlight 4 Esclusione della DataForm Genera automaticamente per inserire caselle combinate legati Convertitori

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

Domanda

Ho lavorato verso una soluzione per un certo tempo e potrebbe utilizzare un po 'di aiuto. So che ho visto un esempio di questo prima, ma stasera non riesco a trovare nulla vicino a quello che mi serve.

Ho un servizio che mi fornisce tutti i miei DropDownList, sia da cache o dal DomainService. Essi sono presentati come IEnumerable, e sono richiesti dal un repository con GetLookup (LookupId).

Ho creato un attributo personalizzato che ho decorato la mia MetaDataClass che sembra qualcosa di simile:

[Lookup(Lookup.Products)]
public Guid ProductId

Ho creato un modulo dati personalizzato che è impostato per AutoGenerateFields e sto intercettando i campi AutoGenerate.

Sto controllando per la mia CustomAttribute e che funziona.

Dato questo codice nel mio CustomDataForm (commenti standard rimossi per brevità), qual è il prossimo passo per sostituire la generazione del campo e inserire una casella combinata legata al suo posto?

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);
    }
}

Qualunque citato esempi per SL4 / VS2010 lavoro sarebbe apprezzato.

Grazie

Aggiornamento - Ecco dove mi trovo in. Ho il mio combo ora, ma è sempre vuoto, anche se non è ItemsSource.

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;                    
}
È stato utile?

Soluzione

Ho trovato una soluzione.

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;                    
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top