基于属性设置值实例化类

时间:2017-09-14 08:20:13

标签: c#

在向用户展示ComboBox ObservableCollection<Type>ItemsSource时,如何在SelectedItem绑定的属性中实例化一个类?

ElementListparentItem列表中的元素属于通用类类型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();
            }
        }
    }
}

但是有一种方法可以做到更加“免维护”(无需在添加新元素类型时进行编辑)。

1 个答案:

答案 0 :(得分:1)

int

唯一缺失的链接是您的集合的类型,因此可以强制转换。但那应该是编译时知识。