Silverlight 5: привязка команды к listboxitem

Я новичок в Silverlight, и весь этот шаблон mvvm немного сбивает с толку.

В моем приложении у меня есть два списка: один для страны, а другой - для штатов.

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

т.е. я хочу привязать команду в xaml к listboxitem.

Я пытаюсь найти решение в Google, но либо решения были слишком сложными для меня, чтобы понять, либо использовались разные шаблоны mvvm, такие как призма, свет и т. Д.


person Random Thoughts    schedule 09.11.2012    source источник


Ответы (1)


Есть несколько способов сделать это:

1. (Самый простой!) Свяжите SelectedItem первого ListBox с вашей ViewModel. В Setter для свойства ViewModel измените список, который вы привязываете ко второму списку. Обратите внимание, что ваше свойство ViewModel должно будет использовать INotifyPropertyChanged для уведомления об изменении списка.

Например: если ваш xaml выглядит так:

<ListBox ItemSource="{Binding ListOne}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"/>
<ListBox ItemSource="{Binding ListTwo}"/>

Тогда ваша ViewModel может выглядеть примерно так:

public List<MyItem> ListOne { get; set; }

private MyItem _selectedItem
public MyItem SelectedItem
{
    get { return _selectedItem; }
    set
    {
        _selectedItem = value;
        ListTwo = _selectedItem.SubItems;
    }
}

private List<MyOtherItem> _listTwo
public List<MyOtherItem> ListTwo
{
    get { return _listTwo; }
    set
    {
        _listTwo = value;
        RaisePropertyChanged("ListTwo");
    }
}

2: Если данные для второго списка буквально являются свойством элементов в первом списке, вы можете использовать привязку в xaml, чтобы напрямую объединить их.

ItemSource="{Binding Path=SelectedItem.MyItemsProperty, ElementName=MyFirstListBoxName}"

3. Вы можете использовать EventTrigger с EventToCommand, чтобы превратить событие SelectedItemChanged в выполнение команды. Вы не привязываете буквально команду к ListBoxItem, вы привязываете команду к изменению.

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

person Duncan Matheson    schedule 09.11.2012
comment
Можете ли вы уточнить: «В Setter для свойства ViewModel измените список, который вы привязываете ко второму списку». - person Random Thoughts; 09.11.2012
comment
Я расширил ответ на этот вариант. См. Выше. - person Duncan Matheson; 09.11.2012