XAML - StaticResources в инициализаторах коллекции - PullRequest
2 голосов
/ 10 декабря 2008

Я хочу добавить один объект модели, который был создан один раз в 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 не отображал это правильно, но это делает!

Ответы [ 2 ]

4 голосов
/ 27 января 2009

Мне удалось избежать проблемы, явно инициализировав новую коллекцию в свойстве Tags. Примерно так:

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

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

0 голосов
/ 11 декабря 2008

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

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

...