當用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();
}
}
}
}
但添加時,將是巨大的它有辦法做到這一點,是多一點「免費維修」(無需編輯一個新的元素類型)。
您可以從*該集合中設置初始值'SelectedElementType = ElementTypeList.FirstOrDefault()'或任何其他項*。剩下的將由綁定完成。 – Sinatr
@Sinatr不知道你的解決方案將如何幫助我... – Oystein
爲什麼在getCommand/setter屬性中使用'GetType()'綁定到'ComboBox.SelectedItem'?你不必(我的第一個評論適用)或我不明白的東西。看起來你並不打算從代碼隱藏中改變'SelectedElementType',然後讓視圖(綁定)來處理它。 – Sinatr