Как я могу реализовать SelectionChanged в MVVM ListBox Silverlight - PullRequest
5 голосов
/ 01 января 2012

Элемент управления ListBox не реализует свойство Command. Я должен прикрепить некоторые функциональные возможности к событию SelectionChanged. Кто-нибудь знает, как я могу это сделать? Пожалуйста, помогите мне

Ответы [ 5 ]

19 голосов
/ 01 января 2012

Я предпочитаю использовать привязку к SelectedItem и реализовывать любые функции в настройке свойства привязки.

<ListBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" />

...

public class ViewModel
{
    public IEnumerable<Item> Items { get; set; } 

    private Item selectedItem;
    public Item SelectedItem
    {
        get { return selectedItem; }
        set
        {
            if (selectedItem == value)
                return;
            selectedItem = value;
            // Do logic on selection change.
        }
    }
}
15 голосов
/ 25 мая 2012

Это способ, с помощью которого вы можете получить доступ к измененным событиям в приложении MVVM. Прежде всего, я говорю вам, что свойство Command работает только в кнопке, теперь мы должны явно привязка этого свойства в нашем событии Selection Changed, таком как список или комбинированное окно в вашем файле XMAL

<ListBox Name="MyListBox" ItemsSource="{Binding ListItems}" Height="150" Width="150" Margin="281,32,-31,118">

        <Local:Interaction.Triggers>
            <Local:EventTrigger EventName="SelectionChanged">
                <Local:InvokeCommandAction Command="{Binding MyCommand}" CommandParameter="{Binding ElementName=MyListBox,Path=SelectedItem}"/>
            </Local:EventTrigger>
        </Local:Interaction.Triggers>
    </ListBox>

для этого вам нужно добавить dll Syatem.Windows.Interactivity Теперь вам нужно добавить ссылки в пространство имен вашего файла xaml, например

 xmlns:Local="clr-namespace:System.Windows.Interactivityassembly=System.Windows.Interactivity"

в вашем классе ViewModel вы должны определить свою команду в структуре Con

 public ViewModel123()
    {
         MyCommand = new RelayCommand<string>(TestMethod);

    }

Теперь создайте метод TestMethod, который может обрабатывать событие изменения выбора

 private void TestMethod(string parameter)
    {
        MessageBox.Show(parameter);
    }

Надеюсь, это поможет тебе.

2 голосов
/ 02 января 2012

В основном у вас есть несколько вариантов:

  1. Используйте свойство SelectedItem ListBox для привязки к свойству в бэкэнде (то есть в модели представления) и выполните логику в установщике, как описано в Кэмерон МакФарланд .
  2. Используйте стороннюю библиотеку, которая имеет общее событие для управления поведением, как в ссылке, опубликованной Педро Ламасом .
  3. Если вы не хотите использовать сторонние библиотеки или писать логику в установщике свойств как-то неприемлемо, вы можете создать свое собственное поведение для элемента управления ListBox. Он подпишется на событие SelectionChanged элемента управления и выполнит команду (команда может быть свойством зависимости, предоставляемым поведением).
1 голос
/ 01 января 2012

Думаю, этот пост от Лорана Буньона поможет вам решить проблему:

http://geekswithblogs.net/lbugnion/archive/2010/05/19/handling-datagrid.selecteditems-in-an-mvvm-friendly-manner.aspx

В посте выше упоминается DataGrid, но я думаю, что он будет работать и с ListBox!

С наилучшими пожеланиями и счастливого Нового года!:)

0 голосов
/ 01 января 2012

Я бы предложил использовать RelayCommand. Либо используйте MVVM Light Toolkit , либо просто используйте RelayCommand и CommandManager классы из реализации Джоша Смита . Я лично использую только два класса, поэтому мне не нужен весь инструментарий.

Хотя это определенно сработает, может быть более простой способ в зависимости от того, что вы делаете. Возможно, будет проще привязать объект к SelectedValue из ListBox и прослушать изменение этого значения.

...