2015-02-24 6 views
0

Я использую MVVM призмы и мой код выглядит следующим образомКак выполнить команду в WPF

 <ListBox x:Name="myListBox" Grid.Row="0" 
     ItemsSource="{Binding Path=_mySOurce}" 
     ScrollViewer.VerticalScrollBarVisibility="Auto" 
     SelectionChanged="myListBox_SelectionChanged"> 
    </ListBox> 
    <Button Grid.Row="1" x:Name="btnSelect" 
    Command="{Binding Path=SaveCommand}" Content="Select" Margin="396,0,10,0"></Button> 

и в моем коде я есть

public ICommand SaveCommand { get; set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = this; 
     this.SaveCommand = new DelegateCommand<object>(this.OnSaveClick, this.CanSaveExecute);  
    } 

    private void myListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 

    } 

    private void OnSaveClick(object arg) 
    { 

     MessageBox.Show("Performed Click"); 
    } 
    private bool CanSaveExecute(object arg) 
    { 
     if (myListBox.SelectedIndex > 0) 
      return true; 

     else return false; 
    } 

Я не в состоянии стрелять при выборе изменен мероприятие.

Что мне не хватает?

+1

в myListBox_SelectionChanged fire это SaveCommand.Execute (параметр)? – puko

+0

Если вы хотите запустить эту команду в SelectionChanged, то где это обработчик этого события? – EngineerSpock

+0

[Здесь ответ] (http://stackoverflow.com/questions/18959304/wpf-listbox-selectionchanged-mvvm) –

ответ

1

Если вы работаете с пользовательским интерфейсом в своей модели просмотра, то вы используете , а не, используя MVVM вообще! Обработка событий пользовательского интерфейса в модели просмотра полностью нарушает разделение проблем, которые предоставляет MVVM.

Однако короткий ответ:

private void myListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (SaveCommand.CanExecute(null)) SaveCommand.Execute(null); 
} 

Гораздо лучшим решением является добавление еще одно свойство для привязки данных к ListBox.SelectedItem собственности:

<ListBox x:Name="myListBox" Grid.Row="0" SelectedItem="{Binding CurrentItem}" 
    ItemsSource="{Binding Path=_mySOurce}" 
    ScrollViewer.VerticalScrollBarVisibility="Auto" 
    SelectionChanged="myListBox_SelectionChanged" /> 

Тогда сеттер для этого CurrentItem имущества будет называться всякий раз, когда будет называться событие SelectionChanged:

public YourDataType CurrentItem 
{ 
    get { return currentItem; } 
    set 
    { 
     currentItem = value; 
     NotifyPropertyChanged("CurrentItem"); 
     if (SaveCommand.CanExecute(null)) SaveCommand.Execute(null); 
    } 
} 
+0

Я еще не уверен, что хуже: есть побочные эффекты в устройстве настройки свойств (например, этот последний пример), или НЕ делать это, потому что это очень, очень удобный и довольно элегантный способ реализации такого поведения в WPF/MVVM, своего рода «реактивная» вещь (до тех пор, пока вы не забудете скрытую сторону -эффект). Интересная дискуссия здесь: http: //programmers.stackexchange.com/questions/82377/should-properties-have-side-effects – heltonbiker

+0

Возможно, вы неправильно читаете свой связанный пост ... нет абсолютно никаких упоминаний о «побочных эффектах» в сеттерах , Можете ли вы придумать какой-либо недостаток этого кода, потому что я хотел бы услышать об этом, если вы это сделаете? – Sheridan

+1

Весьма спорная проблема: когда кто-то устанавливает свойство, вы обычно не ожидаете, что другие, косвенные вещи происходят за вашей спиной. Такое поведение отлично, когда оно сконструировано так, и вы это помните. Но если кто-то из коллег должен работать с ним, поведение не очевидно, это то, что нужно понять. Мне уже приходилось проводить занятия по уборке дома, забыть пойти в сеттер и поменяться там тоже, а потом все вдруг перестает работать. Но я не стал бы слишком беспокоиться об этом, потому что, как я уже сказал, я думаю, что эти шаблоны решают гораздо больше проблем, которые он создает. – heltonbiker

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