【问题标题】:XAML - StaticResources in Collection InitializersXAML - 集合初始值设定项中的静态资源
【发布时间】:2008-12-10 20:53:23
【问题描述】:

我想添加一个已在 XAML 中实例化一次的单个模型对象,并将其添加到两个不同的集合(在 xaml 中)。

以下代码在 Blend 的设计时呈现良好,但在运行时出现以下错误:

对于“Post1”
“WpfBlog.Models.Tag”类型的对象无法转换为“System.Collections.ObjectModel.ObservableCollection`1[WpfBlog.Models.Tag]”类型。标记文件 'WpfBlog;component/Admin.xaml' 行 XX 位置 YY 中的对象 'WpfBlog.Admin' 出错。

如果我注释掉“Post1”,我会在“Post2”上收到此错误
无法将元素添加到属性“标签”,因为如果该属性使用显式集合标签,则它只能有一个子元素。标记文件“WpfBlog;component/Admin.xaml”行 AA 位置 BB 中的对象“System.Windows.StaticResourceExtension”出错。

<Window.Resources>
    <model:Tag x:Key="TDD" Name="TDD" ForeColor="Black" BackColor="White" />
    <model:Tag x:Key="Agile" Name="Agile" ForeColor="White" BackColor="Black" />
    <model:Tag x:Key="Waterfail" Name="Waterfail" ForeColor="Red" BackColor="White" />
</Window.Resources>
<Window.DataContext>
    <local:AdminViewModel>
        <local:AdminViewModel.AllTags>
            <StaticResource ResourceKey="TDD"/>
            <StaticResource ResourceKey="Agile"/>
            <StaticResource ResourceKey="Waterfail"/>
        </local:AdminViewModel.AllTags>
        <local:AdminViewModel.Posts>
            <local:PostViewModel Title="Post1">
                <local:PostViewModel.Tags>
                    <StaticResource ResourceKey="TDD" />
                </local:PostViewModel.Tags>
            </local:PostViewModel>
            <local:PostViewModel Title="Post2">
                <local:PostViewModel.Tags>
                    <StaticResource ResourceKey="TDD" />
                    <StaticResource ResourceKey="Agile" />
                    <StaticResource ResourceKey="Waterfail" />
                </local:PostViewModel.Tags>
            </local:PostViewModel>
        </local:AdminViewModel.Posts>
    </local:AdminViewModel>
<Window.DataContext>

以下代码编译并运行良好,但创建了两个名为“TDD”的标签,所以如果我尝试重命名标签,我必须为所有帖子重命名,而不仅仅是一个 Tag 对象。

<Window.Resources>
    <model:Tag x:Key="TDD" Name="TDD" ForeColor="Black" BackColor="White" />
    <model:Tag x:Key="Agile" Name="Agile" ForeColor="White" BackColor="Black" />
    <model:Tag x:Key="Waterfail" Name="Waterfail" ForeColor="Red" BackColor="White" />
</Window.Resources>
<Window.DataContext>
    <local:AdminViewModel>
        <local:AdminViewModel.AllTags>
            <StaticResource ResourceKey="TDD"/>
            <StaticResource ResourceKey="Agile"/>
            <StaticResource ResourceKey="Waterfail"/>
        </local:AdminViewModel.AllTags>
        <local:AdminViewModel.Posts>
            <local:PostViewModel Title="Post1">
                <local:PostViewModel.Tags>
                    <model:Tag Name="TDD" ForeColor="Black" BackColor="White" />
                </local:PostViewModel.Tags>
            </local:PostViewModel>
            <local:PostViewModel Title="Post2">
                <local:PostViewModel.Tags>
                    <model:Tag Name="TDD" ForeColor="Black" BackColor="White" />
                    <model:Tag Name="Agile" ForeColor="White" BackColor="Black" />
                    <model:Tag Name="Waterfail" ForeColor="Red" BackColor="White" />
                </local:PostViewModel.Tags>
            </local:PostViewModel>
        </local:AdminViewModel.Posts>
    </local:AdminViewModel>
<Window.DataContext>

有什么想法吗?如果 Blend 没有正确渲染它,我可以忽略它并解决它,但它确实如此!

【问题讨论】:

    标签: wpf xaml observablecollection static-resource


    【解决方案1】:

    我可以通过在 Tags 属性中显式初始化一个新集合来避免这个问题。像这样的:

    <local:PostViewModel Title="Post1">
      <local:PostViewModel.Tags>
         <model:TagCollection>
            <StaticResource ResourceKey="TDD" />
         </model:TagCollection>
      </local:PostViewModel.Tags>
    

    显然,这只有在您允许您的 Tags 属性可写时才有可能。

    【讨论】:

      【解决方案2】:

      我认为这与this question 中描述的问题非常相似。

      解决方案应该是为您的 元素添加一个 x:Shared="False" 属性。这告诉 WPF 不要在每次引用一个实例时共享一个实例,而是创建它们的新实例。

      【讨论】:

        猜你喜欢
        • 2014-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多