2

XAMLで一度インスタンス化された単一のモデルオブジェクトを追加し、それを2つの異なるコレクション(xaml)に追加したいと思います。

次のコードはBlendのデザイン時に正常にレンダリングされますが、実行時に次のエラーが発生します。

「Post1」
の場合、タイプ「WpfBlog.Models.Tag」 のオブジェクトをタイプ「System.Collections.ObjectModel.ObservableCollection`1[WpfBlog.Models.Tag]」に変換できません。マークアップファイル'WpfBlog;component/Admin.xaml'のオブジェクト'WpfBlog.Admin'でエラーが発生しました。行XX位置YY。

「Post1」をコメントアウトすると、「Post2」でこのエラーが発生します。
プロパティが明示的なコレクションタグを使用している場合、プロパティは子要素を1つしか持てないため、プロパティ「タグ」に要素を追加できません。マークアップファイル'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」という名前の2つのタグが作成されるため、タグの名前を変更しようとすると、1つの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が正しくレンダリングしなかった場合は、無視して回避することができますが、実際にレンダリングされます。

4

2 に答える 2

5

Tags プロパティ内で新しいコレクションを明示的に初期化することで、この問題を回避できました。このようなもの:

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

明らかに、これは Tags プロパティを書き込み可能にした場合にのみ可能です。

于 2009-01-27T17:20:10.940 に答える
0

これは、この質問で説明されている問題と非常によく似ていると思います。

解決策は、 x:Shared="False" 属性を <model:Tag> 要素に追加することです。これにより、インスタンスが参照されるたびに単一のインスタンスを共有せず、代わりにそれらの新しいインスタンスを作成するように WPF に指示します。

于 2008-12-10T21:25:42.353 に答える