wpf - XAML - 集合初始值设定项中的静态资源

标签 wpf xaml observablecollection static-resource

我想添加一个已在 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”上收到此错误
无法将元素添加到属性“Tags”,因为如果该属性使用显式集合标记,则该属性只能有一个子元素。标记文件“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 没有正确渲染它,我可以忽略它并解决它,但它确实如此!

最佳答案

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

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

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

关于wpf - XAML - 集合初始值设定项中的静态资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/357578/

相关文章:

wpf - 在其 winforms 父级中拖动托管 WPF 控件吞噬的事件

wpf - 如何开始在 .net core 3 WPF 应用程序上使用 MvvmLight?

wpf - 如何在wpf中动态更改Xaml页面标题?

c# - 为什么我的 SplitView 的内容和 Pane 在同一区域?

c# - WPF-如何更新列表列表项的更改

c# - ObservableCollection (ViewModel) 中的 MVVM ObservableCollection

c# - 在 MVVM 中使用 Rx 跟踪集合更改

c# - 更改背景切换按钮

c# - 使用不同的用户名连接到同一服务器

c# - 防止 XAML 中的重复代码