2008-12-10 24 views
2

我想添加一个模型对象,该对象在XAML中已经实例化了一次,并将其添加到两个不同的集合(在xaml中)。XAML - 集合初始化程序中的StaticResources

下面的代码呈现在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'Line AA Position 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”生成,所以如果我尝试重命名标签,我必须这样做,所有的职位,而不是只是一个标签对象。

<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没有正确渲染它,我可以忽略它并解决它,但它确实!

回答

0

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

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

4

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

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

显然,如果你让你的标签属性是可写的,这是唯一可能的。