Silverlight 4.0 Silverlight 4重写DataForm Autogenerate以插入绑定到转换器的组合框
一段时间以来,我一直在寻找解决方案,需要一些帮助。我知道我以前见过这样的例子,但今晚我找不到任何接近我需要的东西 我有一个服务,可以从缓存或DomainService为我提供所有的DropDownList。它们显示为IEnumerable,并通过GetLookup(LookupId)从存储库中请求 我已经创建了一个自定义属性,该属性修饰了MetaDataClass,如下所示:Silverlight 4.0 Silverlight 4重写DataForm Autogenerate以插入绑定到转换器的组合框,silverlight-4.0,wcf-ria-services,silverlight-toolkit,dataform,Silverlight 4.0,Wcf Ria Services,Silverlight Toolkit,Dataform,一段时间以来,我一直在寻找解决方案,需要一些帮助。我知道我以前见过这样的例子,但今晚我找不到任何接近我需要的东西 我有一个服务,可以从缓存或DomainService为我提供所有的DropDownList。它们显示为IEnumerable,并通过GetLookup(LookupId)从存储库中请求 我已经创建了一个自定义属性,该属性修饰了MetaDataClass,如下所示: [Lookup(Lookup.Products)] public Guid ProductId 我已经创建了一个设置为
[Lookup(Lookup.Products)]
public Guid ProductId
我已经创建了一个设置为AutoGenerateFields的自定义数据表单,我正在拦截autogenerate字段
我正在检查我的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);
}
}
我找到了解决办法
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;
}
那么,这允许您覆盖某些自动生成的控件,但不覆盖其他控件?在
for
循环中,您到底在迭代什么?
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;
}