2017-09-14 75 views
1

當用ComboBoxObservableCollection<Type>作爲ItemsSource向用戶展示時,如何在SelectedItem綁定的屬性中實例化一個類?基於屬性設置值實例化一個類

ElementList列表中的元素在parentItem要麼是通用類型的Element,或者是一類從Element(例如DigitalOutputButtonTrendGraph)繼承的。

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

您可以從*該集合中設置初始值'SelectedElementType = ElementTypeList.FirstOrDefault()'或任何其他項*。剩下的將由綁定完成。 – Sinatr

+0

@Sinatr不知道你的解決方案將如何幫助我... – Oystein

+0

爲什麼在getCommand/setter屬性中使用'GetType()'綁定到'ComboBox.SelectedItem'?你不必(我的第一個評論適用)或我不明白的東西。看起來你並不打算從代碼隱藏中改變'SelectedElementType',然後讓視圖(綁定)來處理它。 – Sinatr

回答

1
var instance = Activator.CreateInstance(value, Controller, ParentElementGroup, ItemLabel); 
parentItem.ElementList[currentItemIndex] = (TYPE)instance; 

唯一缺失的鏈接是您的收藏類型,因此可以投射。但那應該是編譯時間的知識。

+1

非常好,這正是我所需要的。它是「ParentElementGroup」而不是「parentItem」。但除此之外,將實例強制轉換爲所有特定元素類繼承的泛型類「元素」就像魅力一樣工作。 – Oystein

相關問題