Silverlight 4 Esclusione della DataForm Genera automaticamente per inserire caselle combinate legati Convertitori
-
23-09-2019 - |
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;
}
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;
}