Загрузка списков внутри табем - какое событие использовать? - PullRequest
2 голосов
/ 24 февраля 2010

Допустим, у меня есть приложение, которое содержит одно окно. Внутри окна находится табулятор с тремя табэмами. Внутри каждого табе есть пользовательский контроль.

В одной вкладке у меня есть Добавить цвет. На следующей вкладке я добавил фрукты. На третьей вкладке у меня есть отношения, где пользователь может добавить ссылки между фруктами и цветами. Это отношение отображается в списке, например:

Apple > Red
Pear  > Green

Ниже на той же вкладке у меня отсутствует список фруктов и отсутствует список цветов ... то есть фрукты или цвета, которые были добавлены, но не связаны во взаимосвязи. Я должен объяснить, что все эти данные хранятся в трех отдельных текстовых файлах: fruits.txt, colors.txt и relationss.txt.

У меня проблема в следующем. В данный момент заполнение списков и т. Д. Происходит в событии Usercontrol_loaded. Для фруктов / цветов это не имеет значения, так как после нажатия кнопки добавления список перезагружается. Проблема в экране отношений.

Скажем, пользователь запускает программу и нажимает на вкладку отношений, чтобы увидеть, что связано. Скажем, что приведенный выше пример уже был в текстовом файле. Так что эти отношения обнаруживаются - и нет пропавших фруктов. Затем пользователь щелкает вкладку фруктов и добавляет фрукты, а затем вкладку цветов и добавляет цвет. Затем переходит на вкладку отношений. Событие usercontrol_loaded уже произошло, поэтому эти два новых дополнения не отображаются в списках.

Если я переместлю код в событие GotFocus, пользователь не сможет сделать выбор в любом списке, потому что он постоянно загружается, так как нажатие вызывает событие.

Есть ли какое-либо другое событие или способ, которым я мог бы получить это обновление ТОЛЬКО, когда вкладка была "переключена", кроме предоставления кнопки обновления?

Спасибо за чтение.

...

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

Ответы [ 3 ]

1 голос
/ 24 февраля 2010

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

Как предлагает wwosik, создайте класс, который предоставляет открытые свойства Colors, Fruits и Relationships, которые являются наблюдаемыми коллекциями. Поскольку он / она не предложил, но, вероятно, должен был, также выставить публичные MissingColors и MissingFruits наблюдаемые коллекции. Наконец, выставьте открытые свойства SelectedColor и SelectedFruit.

Создание связанных элементов управления:

<ListBox ItemsSource="{Binding Colors}" SelectedItem="{Binding SelectedColor}"/>
<ListBox ItemsSource="{Binding Fruits}" SelectedItem="{Binding SelectedFruit}"/>
<ListBox ItemsSource="{Binding Relationships}"/>
<ListBox ItemsSource="{Binding MissingColors}"/>
<ListBox ItemsSource="{Binding MissingFruits}"/>

Реализуйте метод AddRelationship, который добавляет новые отношения, состоящие из SelectedColor и SelectedFruit. Также следует удалить цвет и фрукты из соответствующих коллекций MissingColors и MissingFruits. Создайте команду, которая вызывает этот метод, и привяжите ее к чему-либо в пользовательском интерфейсе.

Вот и все. Не имеет значения, на какой вкладке что-либо находится. Неважно, в каком порядке пользователь просматривает вещи. Когда пользователь добавляет отношение, или фрукт, или цвет, пользовательский интерфейс будет обновляться.

0 голосов
/ 24 февраля 2010

WPF не является WinForms. Вы не заполняете списки сами по себе.

У вас есть

class MyData{
   ObservableCollection<Color> Colors;
   ObservableCollection<Fruit> Fruits;
   ObservableCollection<Pairs> Pairs;

   public void MatchCurrentSelection(){
        var selectedColor = CollectionViewSource.GetDefaultView(Colors).CurrentItem;
        var selectedFruit = CollectionViewSource.GetDefaultView(Fruits).CurrentItem;
        if(selectedColor != null && selectedFruit != null){
             Colors.Remove(selectedColor);
             Fruits.Remove(selectedFruit);
             Pairs.Add(new Pair(selectedColor, selectedFruit));
        }
   }
} 

ListBoxes

<ListBox ItemsSource="{Binding Colors}" IsSynchronizedWithCurrentItem="true"/>
<ListBox ItemsSource="{Binding Fruits}" IsSynchronizedWithCurrentItem="true"/>
<ListBox ItemsSource="{Binding Pairs}"/>
0 голосов
/ 24 февраля 2010

Вам необходимо привязать свои списки к данным из вашей ViewModel. Таким образом, инфраструктура WPF обгоняет обнаружение момента, когда необходимо обновить данные.

...