限制ItemsControl的子项的编译时类型

时间:2014-02-07 05:21:47

标签: c# itemscontrol items

I know this question has been asked before.我对给出的答案不满意。 我正在寻找一个编译时的解决方案。有没有办法说隐藏ItemsItemSource成员而不破坏类的功能,或者这不是预期的功能?例如,我是否可以通过反映ItemsControl并更改代码来创建ItemsControl<T>,或者我该如何实现此目标?

详细说明一下,我正在制作一个SlideShow控件来在幻灯片放映中显示图像。它继承自ItemsControl,因为它有多个子节点,但我想将它的子节点限制为Image对象,因为我需要访问这些对象。我想在编译时强制执行此限制,以便我可以安全地访问特定的Image成员,而不必担心孩子的类型。

3 个答案:

答案 0 :(得分:0)

我在WPF方面不是很有经验,但在简单的C#中,我只是委托控制。

例如,如果我试图限制我可以添加到ArrayList的对象,我会做类似的事情:

public class ArrayListDemo
{
    private ArrayList innerList;

    public ArrayListDemo()
    {
        innerList = new ArrayList();
    }

    public int Add(string str)
    {
        return innerList.Add(str);
    }

    public void Remove(string str)
    {
        innerList.Remove(str);
    }

    public string this[int index]
    {
        get
        {
            return innerList[index] as string;
        }
        set
        {
            innerList[index] = value;
        }
    }

    public static implicit operator ArrayList(ArrayListDemo stringArrayList)
    {
        return stringArrayList.innerList;
    }
}

这让我可以编写自己的方法实现,而不需要我重载所有方法。隐式转换可用意味着编译器将知道我们的对象可以用来代替我们覆盖的对象。同样,我不知道这是否是你可以用WPF做的事情,或者如果涉及覆盖和委派你的电话的工作太复杂了,但我想我会指出这种方法,以防它可用。

答案 1 :(得分:0)

您需要处理哪些“特殊行为”需要在控件内部完成迭代项目?

你不能在XAML中使用泛型(尽管你可以让它以有限的方式工作),所以你设计的任何东西都只能处理一种类型的对象,在你的情况下是Image。如何在运行时绑定您想要的任何类型更可重用?

创建UserControl来处理幻灯片功能有什么问题,而不是试图强制控制类型不适合你正在做的事情?

为什么要迭代Items属性?它似乎主要被设计为主要由底层WPF系统使用,而不是由客户端使用。您通过简单绑定无法实现的功能是什么?

答案 2 :(得分:0)

我明白了。 Windows Phone Toolkit中有一个控件,它具有我正在寻找的完全相同的行为。 TiltEffect依赖项对象在编译时强制它的父类型。 “属性IsTiltEnabled不支持类型的值...”我只需要做同样的事情,但对于我控制的孩子。

您需要做什么,更具体地说,将ItemsContorl的Items(通过ItemsSource ...)更改为强类型集合,例如一个ObservableCollection