WPF正确的编程绑定绑定的组合框
本文关键字:绑定 组合 编程 WPF | 更新日期: 2023-09-27 17:49:40
我正在使用一个wpf应用程序,并且目前正在实现一个属性网格框,类似于您可能在Visual studio的属性窗口中看到的一个。
当我的应用程序中的项目使用反射选择时,我动态地填充这个属性窗口,但这意味着我也必须动态地创建输入法。(文本框,复选框,组合框),具体取决于属性的类型。
由于这是动态生成的,因此我必须以编程方式创建这些项。
我有下面的代码,它决定是要从属性生成一个文本框,还是一个组合框,然后它绑定了这个组合框。
var attribute = (PropertyWindowAttribute) attributes[i];
if (attribute.Enumerated)
{
var combo = new ComboBox();
var binding = CreatePropertyBinding(Model.component, attribute.PropertyName);
combo.SetBinding(Selector.SelectedItemProperty, binding);
var enumValues = Enum.GetNames(Model.component.GetType().GetProperty(attribute.PropertyName).PropertyType);
foreach (var e in enumValues)
{
var item = new ComboBoxItem();
item.Content = e;
combo.Items.Add(item);
}
propertyList.Add(new PropertyElement(attribute.DisplayName, combo));
}
else
{
var binding = CreatePropertyBinding(Model.component, attribute.PropertyName);
var box = new TextBox();
box.SetBinding(TextBox.TextProperty, binding);
propertyList.Add(new PropertyElement(attribute.DisplayName, box));
}
}
还有这个被引用的实用程序方法
private static Binding CreatePropertyBinding(Component component, string path)
{
Binding binding = new Binding();
binding.Path = new PropertyPath(path);
binding.Mode = BindingMode.TwoWay;
binding.Source = component;
return binding;
}
我遇到的问题是,当我去到我的应用程序,并试图改变一个组合框的值,我得到以下错误输出在我的应用程序
<>之前System.Windows. data错误:23:无法将"System.Windows. controls .ComboBoxItem: Stretch"类型从"ComboBoxItem"转换为"System.Windows"类型。HorizontalAlignment'用于默认转换的'en-US'文化;考虑使用Binding的Converter属性。NotSupportedException:由于系统。NotSupportedException: EnumConverter不能从System.Windows.Controls.ComboBoxItem转换。在System.ComponentModel.TypeConverter。GetConvertFromException(对象值)在System.ComponentModel.TypeConverter。ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)在System.ComponentModel.EnumConverter。ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)在MS.Internal.Data.DefaultValueConverter。ConvertHelper(Object o, Type destinationType, DependencyObject targetElement, CultureInfo culture, Boolean isForward)'System.Windows.Data错误:7:ConvertBack无法转换值"System.Windows.Controls.ComboBoxItem: Stretch"(类型"ComboBoxItem")。BindingExpression:路径= ComponentHorizontalAlignment;DataItem = ' TextFieldComponent ' (HashCode = 31097589);目标元素是'ComboBox' (Name= ");目标属性是'SelectedItem'(类型为'Object')。NotSupportedException: EnumConverter不能从System.Windows.Controls.ComboBoxItem转换。在MS.Internal.Data.DefaultValueConverter。ConvertHelper(对象0,类型destinationType, DependencyObject targetElement, CultureInfo文化,布尔值为forward)在MS.Internal.Data.ObjectTargetConverter。转换返回(对象0,类型类型,对象参数,CultureInfo区域性)在System.Windows.Data.BindingExpression。ConvertBackHelper(IValueConverter转换器,对象值,类型sourceType,对象参数,CultureInfo文化)'之前被绑定到组合框的值来自枚举,但我不确定是什么修复这个
既然您正在将ComboBoxItems添加到ComboBox中。Item集合,然后SelectedItem将是被选中的ComboBoxItem。因此,您实际上是在尝试将枚举属性设置为ComboBoxItem的实例。
你的循环应该是这样的:
var enumValues = Enum.GetValues(Model.component.GetType().GetProperty(attribute.PropertyName).PropertyType);
foreach (var e in enumValues) {
combo.Items.Add(e);
}
如果你需要样式组合框项,你可以使用组合框。ItemContainerStyle直接设置属性。或者您可以像现在一样添加ComboBoxItems,并在绑定到模型时使用SelectedValue和SelectedValuePath。