XAML - StaticResources в инициализаторах коллекции

Я хочу добавить один объект модели, который был создан один раз в XAML, и добавить его в две разные коллекции (в xaml).

Следующий код прекрасно отображается во время разработки Blend, но я получаю следующие ошибки во время выполнения:

Для объекта «Post1»
типа «WpfBlog.Models.Tag» невозможно преобразовать в тип «System.Collections.ObjectModel.ObservableCollection`1 [WpfBlog.Models.Tag]». Ошибка в объекте 'WpfBlog.Admin' в файле разметки 'WpfBlog; component / Admin.xaml' Строка XX Позиция YY.

Если я закомментирую «Post1», я получу эту ошибку на «Post2».
Невозможно добавить элемент в свойство «Теги», поскольку у свойства может быть только один дочерний элемент, если он использует явный тег коллекции. Ошибка в объекте 'System.Windows.StaticResourceExtension' в файле разметки 'WpfBlog; component / Admin.xaml' Строка AA Позиция BB.

<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 не отобразил это правильно, но это делает!

10.12.2008 20:53:23
2 ОТВЕТА

Я думаю, это очень похоже на проблему, описанную в этом вопросе .

Решением должно быть добавление атрибута x: Shared = "False" к вашим элементам <model: Tag>. Это говорит WPF не использовать один экземпляр каждый раз, когда на него ссылаются, а создавать новые экземпляры.

0
23.05.2017 10:32:49

Мне удалось избежать этой проблемы за счет явной инициализации новой коллекции в свойстве Tags. Что-то вроде этого:

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

Очевидно, что это возможно только в том случае, если вы разрешите запись в свойстве Tags.

4
27.01.2009 17:20:10