ContentControl не изменяет содержимое - функция никогда не вызывается

Я хочу динамически менять свой контент с AppBar с помощью этого кода:

<Page.Resources>
    <local:AppBarSelector x:Key="myAppBarSelector"/>
</Page.Resources>

<Page.BottomAppBar>
    <AppBar>
        <ContentControl Content="{Binding SelectedItem, ElementName=listBox}" ContentTemplateSelector="{StaticResource myAppBarSelector}">
            <ContentControl.Resources>
                <DataTemplate x:Key="1">
                    <TextBlock Text="Hallo Welt 1" Foreground="White" />
                </DataTemplate>

                <DataTemplate x:Key="2">
                    <TextBlock Text="Hallo Welt 2" Foreground="White" />
                </DataTemplate>
            </ContentControl.Resources>
        </ContentControl>
    </AppBar>
</Page.BottomAppBar>

И это мой код позади:

public class AppBarSelector : DataTemplateSelector
{
    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        Debug.WriteLine((string)item);
        if (item == null) return base.SelectTemplateCore(item, container);

        var contentControl = (ContentControl)container;
        var templateKey = (string)item;

        return (DataTemplate)contentControl.Resources[templateKey];
    }
}

Но этот метод называется нервнее. Даже функция Debug.WriteLine. Где моя ошибка?


person Cilenco    schedule 27.04.2013    source источник
comment
Вы уверены, что ваш элемент на самом деле является строкой? это, вероятно, исключение в этот момент. ваш элемент является вашим обязательным элементом ItemsSource.   -  person NSGaga-mostly-inactive    schedule 28.04.2013
comment
Да, я заполняю ListView: listBox.ItemsSource = new List<string> { "1" , "2", "3" , "4"}; У меня есть второй ContentControl, который использует другой Page.Resource, но также и строку элемента listView - это прекрасно работает, но здесь функция не вызывается...   -  person Cilenco    schedule 28.04.2013
comment
извините, что сомневаюсь в вас :) вы получаете какие-либо ошибки в представлении отладки? и снова тривиально, но уверены ли вы, что он не «попадает» в SelectTemplateCore (поставьте точку останова, а не просто сброс).   -  person NSGaga-mostly-inactive    schedule 28.04.2013
comment
Я не могу найти ошибку в представлении отладки... Метод вызывается один раз после запуска приложения, но больше никогда не вызывается:/ Но во втором ContentControl.Resources (для основного контента - не для AppBar ) Я получаю сообщение об ошибке объявленный префикс, но я могу скомпилировать и запустить приложение. Это проблема?   -  person Cilenco    schedule 29.04.2013
comment
ок, это другое (один раз входит - оно "живое" :) - это знакомо. Во-первых, вы должны сделать правильный MVVM, так как это обычно является источником проблем (не имеет значения в вашем случае, но - установите ItemsSource для привязки к свойству в VM - это ObservableCollection<string> (не List‹›)). Также посмотрите на это. Кажется, ваша привязка не срабатывает (у меня нет возможности проверить это, поэтому я просто даю подсказки). Окончательное решение - использовать MultiBinding и заставить его "измениться"...   -  person NSGaga-mostly-inactive    schedule 29.04.2013
comment
на самом деле это должно работать «как есть», и я не вижу здесь ничего проблематичного, но вы все равно должны сделать это «ObservableCollection» и т. д., просто чтобы переработать, посмотреть, поможет ли это (хотя это не должно иметь значения в вашем случае). И, наконец, try to make a small 'primer' that repeats the issue (со всем кодом позади, ListBox XAML и т. д.), и я могу взглянуть - это также поможет вам добраться до сути. Вероятно, это что-то тривиальное, как я уже сказал, но тогда вы должны быть последовательны. Дайте мне знать, и я могу ответить, но с некоторыми подробностями от вас.   -  person NSGaga-mostly-inactive    schedule 29.04.2013
comment
Хорошо, спасибо за то, что я перешел со списка на ObservableCollection<string>, но это не помогает. Сейчас попробую использовать другой способ. Есть ли событие, которое я могу привязать к моему второму ContentControl при изменении содержимого из ContentControl1? Примерно так: <ContentControl Content="{Binding EVENT, ElementName=ContentControl1}". И что я могу сделать с ошибкой declared prefix?   -  person Cilenco    schedule 29.04.2013
comment
Вы не думаете, что «MVVM» :) привязывается к свойству модели представления (оба или аналогичные), и в установщике того, что вы получаете, когда оно изменяется (один из них «двусторонний» или оба). В любом случае вы должны разобраться в этом - эта «ошибка» указывает на некоторые проблемы.   -  person NSGaga-mostly-inactive    schedule 29.04.2013


Ответы (1)


Сразу после некоторых комментариев здесь...
(примечание: это немного общее, но я не могу быть более конкретным без дополнительного кода, чтобы отразить проблемы)

Это должно работать «как есть» - я не вижу никаких проблем, которые могут привести к этому (я быстро проверяю аналогичный пример, и он хорошо работает с .ItemsSource = new List<string>{...}.

Так что это не виновник - но это не повредит тому, что я предложил - сделать правильную привязку MVVM к свойствам, сделать список ObservableCollection<> - а также всегда рекомендуется иметь больше higher-level объектов (вместо только string) в качестве ваших элементов ( помогает во многих случаях с привязкой с похожими проблемами — этот объект реализует INotifyPropertyChanged и т. д. — и вы привязываетесь к «свойству», а не ко всему объекту).

Другая ошибка также указывает на некоторые проблемы.

И, наконец, чтобы связать два элемента управления контентом вместе - обычно вам не нужны события как таковые. Вы можете использовать Triggers из стиля или XAML напрямую, но в большинстве случаев просто привязывайте оба свойства к модели представления и обрабатывайте «изменение» в «сеттере» вашего свойства.

Вы должны создать небольшой учебник для начинающих, который повторяет это — кто знает, это может помочь вам понять, что вы делаете неправильно.

person NSGaga-mostly-inactive    schedule 29.04.2013