在向用户展示ComboBox
ObservableCollection<Type>
为ItemsSource
时,如何在SelectedItem
绑定的属性中实例化一个类?
ElementList
中parentItem
列表中的元素属于通用类类型Element
,或属于从Element
继承的类型(例如DigitalOutputButton
}或TrendGraph
)。
XAML:
<StackPanel Orientation="Horizontal">
<TextBlock Width="100" Text="Element Type:" />
<ComboBox Width="300" ItemsSource="{Binding Path=Element.ElementTypeList}"
SelectedItem="{Binding Path=Element.SelectedElementType}" />
</StackPanel>
C#代码:
private static ObservableCollection<Type> _elementTypeList
= new ObservableCollection<Type> { typeof(Element), typeof(DigitalOutputButton), typeof(TrendGraph) };
public static ObservableCollection<Type> ElementTypeList { get { return _elementTypeList; } }
public Type SelectedElementType {
get { return GetType(); }
set {
if (value != GetType()) {
var parentItem = Controller.ConfigurationHandler.FindParentItem(this);
var currentItemIndex = parentItem.ElementList.IndexOf(this);
parentItem.ElementList[currentItemIndex] = new typeof(value)();
}
}
}
上面的set
代码无法构建。但是有可能以另一种方式实现这种行为吗?
编辑:好的,这种方式有效:
public Type SelectedElementType {
get { return GetType(); }
set {
if (value != GetType()) {
var parentItem = Controller.ConfigurationHandler.FindParentItem(this);
var currentItemIndex = parentItem.ElementList.IndexOf(this);
if (value == typeof(Element)) {
parentItem.ElementList[currentItemIndex] = new Element();
}
else if (value == typeof(DigitalOutputButton)) {
parentItem.ElementList[currentItemIndex] = new DigitalOutputButton();
}
else if (value == typeof(TrendGraph)) {
parentItem.ElementList[currentItemIndex] = new TrendGraph();
}
}
}
}
但是有一种方法可以做到更加“免维护”(无需在添加新元素类型时进行编辑)。
答案 0 :(得分:1)
int
唯一缺失的链接是您的集合的类型,因此可以强制转换。但那应该是编译时知识。