Некоторые рекомендации по дизайну, касающиеся списка wp7 и привязки данных - PullRequest
0 голосов
/ 28 декабря 2011

Я портирую приложение Android на wp7 и пытаюсь все делать по-сетевому, и я начинаю думать о привязке данных, но теряюсь, когда дело касается нескольких вещей,

Мои классы состоят из следующего:

  • PickLeaf - представление данных каждого элемента в списке
  • PickLeafModel - представление данных коллекции объектов PickLeaf
  • PickLeafCell - пользовательский элемент управления для каждого элемента в списке
  • PickLeafListView - производная версия ListBox
  • PickLeafPage - страница, которая содержит представление списка и создает экземпляры некоторых контроллеров.объекты и потоки
  • IPickLeafListener - интерфейс, который реализует PickLeafPage и позволяет ему получать уведомления при возникновении определенных событий, касающихся PickLeafCell (нажмите, контекстное меню открыто, окно прокрутки изменено)

В настоящее время я добавляю элементы управления PickLeafCell динамически в PickLeafListView.Items, что связано с привязкой данных и, возможно, приводит к появлению некоторых ошибок, которые я вижу (например, обновление его во время прокрутки приводит к тому, что окно прокрутки приходит в бешенство).

ВОПРОС: Если я изменюсьчтобы PickLeafModel можно было использовать в качестве источника данных, как передать ссылки IPickLeafListener и PickLeaf на PickLeafCell с помощью привязки данных?

Спасибо!

1 Ответ

1 голос
/ 28 декабря 2011

Трудно понять вашу архитектуру, но я стараюсь.

Прежде всего, свяжите ваши данные с ListBox

listBox.ItemsSource = PickLeafModel;

с вашим ListBoxдолжно выглядеть так:

 <ListBox x:Name="listBox" ...>
      <ListBox.ItemTemplate>
           <DataTemplate>
                <my:PickLeafCell DataContext={Binding} TapEvent="Tap" .../>
           </DataTemplate>
      </ListBox.ItemTemplate>
 </ListBox>

Здесь происходят две основные вещи: PickLeafCell DataContext - это привязка к вашим данным для каждого элемента списка.И вы подписываетесь на ваши PickLeafCell настраиваемые события.

Когда какое-либо событие происходит в элементе управления PickLeafCell, оно вызывает настраиваемое событие, на которое подписана ваша главная страница

 public class PickLeafCell...
 {
      public delegate void TapEventEventHandler(object sender, EventArgs e);
      public event TapEventEventHandler TapEvent;

      protected virtual void OnTap(EventArgs e) 
      {
           if (TapEvent != null)
                TapEvent(this, e);
      }

Это вашеКод на главной странице C #, где у вас есть обработчики событий:

 private Tap(object sender, EventArgs e)
 {
      var item = (sender as FrameworkElement).DataContext as PickLeaf;
 }

А в PickLeafCell элементе управления вы уже DataContext уже установили свой PickLeaf, так что вы можете легко привязать к полям

 <TextBlock Text={Binding SomeFieldOfPickLeaf} />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...