在XAML中初始化没有数组的自定义集合

时间:2018-03-22 17:00:08

标签: wpf xaml user-controls dependency-properties

我正在创建一个自定义控件,其中包含要显示的对象集合。我希望这是一个包含一些东西的包装器和一个内部部分,它承载由控件的消费者决定的其他东西。基本上我希望它与StackPanel类似地用于用户创建它并在内容部分中添加控件。我基本上处理了一件我无法弄清楚的事情。以下是需要设置的“Pages”依赖项属性:

    public static readonly DependencyProperty PagesProperty =
        DependencyProperty.Register("Pages", typeof(IEnumerable<MyContentPage>), typeof(UC_ApplicationWindow),
            new PropertyMetadata(new List<MyContentPage>()));

    public IList<MyContentPage> Pages
    {
        get => (IList<MyContentPage>)GetValue(PagesProperty);
        set => SetValue(PagesProperty, value);
    }

这是当前正在运行的此控件的使用者窗口中的代码:

        <graphicElements:UC_ApplicationWindow.Pages>
            <x:Array Type="graphicElements:MyContentPage">
                <graphicElements:MyContentPage>
                    <graphicElements:MyContentPage.Content>
                        ...the contents of the page
                    </graphicElements:MyContentPage.Content>
                </graphicElements:MyContentPage>
                <graphicElements:MyContentPage>
                    <graphicElements:MyContentPage.Content>
                        ...the contents of the page
                    </graphicElements:MyContentPage.Content>
                </graphicElements:MyContentPage>
            </x:Array>
        </graphicElements:UC_ApplicationWindow.Pages>

理想情况下,我希望能够为Pages属性设置多个元素,而不必为其提供数组,但是如果我尝试直接执行此操作,则会收到错误'无法分配指定的值。预计会出现以下类型:“IList'1”。我也希望能够像大多数其他WPF控件那样直接指定页面内容,但是当我取出直接内容属性时,它说'类型'MyContentPage'不支持直接内容'。以下是我最终希望能够看起来的样子:

        <graphicElements:UC_ApplicationWindow.Pages>
            <graphicElements:MyContentPage>
                ...the contents of the page
            </graphicElements:MyContentPage>
            <graphicElements:MyContentPage>
                ...the contents of the page
            </graphicElements:MyContentPage>
        </graphicElements:UC_ApplicationWindow.Pages>

正如我所说,它目前有效,如果它是我必须做的我可以但它看起来有点笨拙我有预感它可以更好地工作,但无法弄清楚如何。任何人都有我失踪的魔法钥匙?

1 个答案:

答案 0 :(得分:0)

好的,感谢this post,我想出来了。您需要做的就是添加内容属性&#39;属性到顶部,XAML将直接指定该属性作为内容。所以在这种情况下,我实际上做了两次。我将[ContentProperty(nameof(Pages))]放在主应用程序窗口类和MyContentPage类的[ContentProperty(nameof(Content))]上。

我还想知道对this post的评论我发现如果你将Pages属性设置为IList而不是IEnumerable,你不必直接指定数组,它只是创建它。现在而不是这个:

union Converter
{
    Converter() : a{} {}
    A a;
    B b;
};

std::ostream& operator <<(std::ostream& os, B& b)
{
    return os << b.data;
}

int main()
{
    Converter c;
    std::cout << c.b;
}

我可以这样做:

<UC_ApplicationWindow>
    <graphicElements:UC_ApplicationWindow.Pages>
        <x:Array Type="graphicElements:MyContentPage">
            <graphicElements:MyContentPage>
                <graphicElements:MyContentPage.Content>
                    ...the contents of the page
                </graphicElements:MyContentPage.Content>
            </graphicElements:MyContentPage>
            <graphicElements:MyContentPage>
                <graphicElements:MyContentPage.Content>
                    ...the contents of the page
                </graphicElements:MyContentPage.Content>
            </graphicElements:MyContentPage>
        </x:Array>
    </graphicElements:UC_ApplicationWindow.Pages>
</UC_ApplicationWindow>

啊......更清洁:)