Silverlight 4 Переопределение автоматической генерации DataForm для вставки комбинированных блоков, привязанных к конвертерам - PullRequest
4 голосов
/ 01 апреля 2010

Я какое-то время работал над решением проблемы и мог бы воспользоваться небольшой помощью. Я знаю, что видел пример этого раньше, но сегодня вечером я не могу найти ничего, что мне нужно.

У меня есть служба, которая предоставляет мне все мои DropDownLists, либо из Cache, либо из DomainService. Они представлены как IEnumerable и запрашиваются из репозитория с GetLookup (LookupId).

Я создал собственный атрибут, который украсил свой MetaDataClass, который выглядит примерно так:

[Lookup(Lookup.Products)]
public Guid ProductId

Я создал пользовательскую форму данных, для которой установлено значение AutoGenerateFields, и я перехватываю поля для автоматического создания.

Я проверяю свой CustomAttribute, и это работает.

Учитывая этот код в моей CustomDataForm (стандартные комментарии удалены для краткости), каков следующий шаг, чтобы переопределить создание поля и поместить на его место связанный комбинированный список?

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

Будем благодарны за любые приведенные рабочие примеры для SL4 / VS2010.

Спасибо

Обновление - вот где я. Теперь я получаю комбо, но оно всегда пустое, хотя 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;                    
}

1 Ответ

4 голосов
/ 05 мая 2010

Я нашел решение.

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