2012-01-01 3 views

ответ

18

Я предпочитаю использовать привязку к 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. 
     } 
    } 
} 
+0

Отличный совет, спасибо – James

+0

Будет ли он работать с несколькими выборами? – Simsons

+0

@Simsons Только если у вас есть способ привязки к множественному выбору. Я считаю, что свойство SelectedItem игнорируется во время multi-select. –

0

Я бы предложил использовать RelayCommand. Используйте либо MVVM Light Toolkit, либо просто используйте классы RelayCommand и CommandManager от Josh Smith's implementations. Я лично использую только два класса, поэтому мне не нужен весь инструментарий.

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

+0

Спасибо вам всем за помощь) С Новым годом !!! –

2

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

  1. Используйте свойство SelectedItem из ListBox для привязки к свойству в интерфейсе (то есть в модели представления) и выполнять логику в сеттере, как описано Cameron MacFarland.
  2. Используйте стороннюю библиотеку, которая имеет общее событие для управления поведением, как в ссылке, размещенной Pedro Lamas.
  3. Если вы не хотите использовать сторонние библиотеки или писать логику внутри устройства настройки свойств, вы как-то неприемлемы, вы можете создать свое собственное поведение для элемента управления ListBox. Он будет подписаться на событие управления SelectionChanged и выполнить команду (команда может быть свойством зависимостей, отображаемым поведением).
15

Это путь, где вы можете достичь Выбор изменили события в вашей MVVM Применение Прежде всего, я говорю вам, что команда недвижимости работают только в Баттона теперь мы должны Явное связывания этого имущества в нашем выборе 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.Интерактивность Теперь у вас добавить ссылки в вашей 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); 
    } 

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

+0

Я предпочитаю этот путь, поскольку я думаю, что он чище. –

Смежные вопросы