Я какое-то время работал над решением проблемы и мог бы воспользоваться небольшой помощью. Я знаю, что видел пример этого раньше, но сегодня вечером я не могу найти ничего, что мне нужно.
У меня есть служба, которая предоставляет мне все мои 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;
}