Могу ли я привязать данные к свойствам пользовательского класса (созданного в xaml), который затем формирует содержимое шаблонного списка - PullRequest
1 голос
/ 09 декабря 2010

Любая помощь в этом действительно приветствуется.Итак, я пытаюсь привязать данные к свойствам пользовательского класса, созданного в xaml, который затем формирует содержимое шаблонного listboxitem (фу!).

У меня есть простой класс c # с именем MenuItem.У него есть два свойства: - Заголовок - Значок

Концентрирование только на одном из этих пунктов меню (т. Е. Чтобы дать простой пример того, где я застрял). Если я делаю это (с жестко заданными значениями), он работает нормально.:

<ListBox>
   <ListBoxItem ContentTemplate="{StaticResource MenuItemTemplate}">
        <myclasses:MenuItem Heading="News" IconImage="News.png"/>
    </ListBoxItem>
</Listbox>

Где MenuItemTemplate - это соответствующий DataTemplate в разделе ресурсов, привязывающий каждое свойство), содержащий строки, такие как:

<TextBlock x:Name="tbHeading" Text="{Binding Heading}">

Wheareas, когда я пытаюсь использовать привязку для установки свойства Headingон падает (ошибка AG_E_PARSER_BAD_PROPERTY_VALUE) - например:

<ListBox>
   <ListBoxItem ContentTemplate="{StaticResource MenuItemTemplate}">
        <myclasses:MenuItem Heading="{Binding NewsHeading, Mode=OneWay}" Icon="News.png"/>
    </ListBoxItem>
<Listbox>

Мне было интересно, если это происходит, потому что я делаю какое-то двойное связывание (то есть шаблон связывается со значением в классе MenuItem, которыйдолжен быть связан) и это не возможно?Я попытался объявить свойства как свойства зависимостей, но без разницы (хотя я узнал о них только сегодня, так что я могу что-то упустить).

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

Спасибо !!!!Йен


спасибо за то, что придерживались этого.Я согласен, что список может не понадобиться, но даже если я уменьшу его до одного элемента в contentcontrol:

<ContentControl ContentTemplate="{StaticResource MenuItemTemplate}">
    <myclasses:MenuItem Heading="{Binding NewsHeading, Mode=OneWay}" IconImage="News.png"/>
</ContentControl>

У меня все еще остается та же проблема - то, что я могу получить привязку данных для работы внутрисодержимое contentcontrol (до того, как оно будет представлено табличкой данных, указанной в ContentTemplate) с использованием чисто xaml.

Т.е. вышеуказанный бит xaml не работает - он выдает ошибку на бит, который связывает NewsHeading:

Heading="{Binding NewsHeading, Mode=OneWay}

Поэтому я пытаюсь понять, невозможно или нет то, что я делаю, но я делаю это неправильно.

Спасибо.

1 Ответ

0 голосов
/ 09 декабря 2010

Предполагая, что у вас есть несколько классов MenuItem (потому что вы помещаете их в список, и это не имело бы смысла, если бы у вас был один). Вам необходимо привязать коллекцию к свойству ItemsSource ListBox.

Что-то вроде этого:

<ListBox ItemsSource="{Binding MyMenuItems}">
    <ListBox.ItemTemplate>
        <DataTemplate>
          <TextBlock Text="{Binding Heading}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Обратите внимание, что вышеизложенное предполагает, что вы установили DataContext на странице для объекта со свойством MyMenuItems, которое является коллекцией ваших MenuItem объектов.

Чтобы увидеть полный пример этого, посмотрите на код по умолчанию, созданный при создании нового «приложения с привязкой к данным Windows Phone».

Edit:
Судя по вашим комментариям, ListBox - не самое подходящее решение для ваших нужд. ListBox предназначен для сбора элементов и отображения их в списке.

Если у вас есть несколько различных объектов, о которых вы знаете во время разработки, и просто хотите, чтобы они располагались один над другим (создавая видимость списка), вы можете просто поместить их в ScrollViewer и / или в StackPanel. (или другой соответствующий контейнер). Кроме того, вы все равно сможете связать данные, если сделаете это таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...