Установить ContentTemplate в CodeBehind: ошибка XamlParseException 2260

Я хотел бы изменить ContentTemplate ContentPresenter в файле CodeBehind. Но если я запускаю приложение Silverlight 4, возникает исключение XamlParseException с кодом ошибки 2260.

foreach (ContentPresenter item in Headers)
{
    item.ContentTemplate = Parent.UnselectedHeaderTemplate;
}

if ((index >= 0) && (index < Headers.Count))
{
    ContentPresenter item0 = (ContentPresenter)Headers[index];
    item0.ContentTemplate = Parent.SelectedHeaderTemplate;
}

Если я делаю только код foreach без кода в "если", это работает. И если я только делаю код в "если" без foreach, он тоже работает. Но вместе (код if и код foreach) это не работает.

Я понятия не имею, почему это не работает. Два шаблона выглядят так:

<Setter Property="UnselectedHeaderTemplate">
        <Setter.Value>
            <DataTemplate>
                <ContentControl Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}"
                           Margin="10,-10"
                           FontSize="72"
                           Foreground="#FF999999"
                           CacheMode="BitmapCache"/>

            </DataTemplate>
        </Setter.Value>
    </Setter>

    <!-- SelectedHeader template -->
    <Setter Property="SelectedHeaderTemplate">
        <Setter.Value>
            <DataTemplate>
                <ContentControl Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}"
                           Margin="10,-10"
                           FontSize="72" 
                           Foreground="{TemplateBinding Foreground}"
                           CacheMode="BitmapCache"/>
            </DataTemplate>
        </Setter.Value>
    </Setter>

Если у вас есть идея, в чем проблема, скажите, пожалуйста.

1 ответ

Я не могу объяснить, почему ваш код не работает, но это ужасный способ достижения этой цели.

Такого рода задачи лучше всего решать с помощью VisualStateManager, Создайте два состояния "Выбрано" и "Не выбрано", оставьте состояние "Не выбрано" пустым, а в состоянии "Выбрано" назначьте цвет "#FF999999" для Foreground,

Теперь все, что нужно сделать вашему коду:

VisualStateManager.GotoState(item, "Selected", false);

или же

VisualStateManager.GotoState(item, "Unselected", false);

на соответствующие предметы.

Другие вопросы по тегам