2011-12-29 17 views

Odpowiedz

35

rozwiązanie MVVM:

Powiąż ItemsSource i SelectedItem właściwości ComboBox do właściwości w Twojej ViewModel:

<ComboBox ItemsSource="{Binding MyItems}" SelectedItem="{Binding MySelectedItem}"/> 

W MainViewModel.cs:

public ObservableCollection<string> MyItems { get; set; } 

private string _mySelectedItem; 
public string MySelectedItem 
{ 
    get { return _mySelectedItem; } 
    set 
    { 
    // Some logic here 
    _mySelectedItem = value; 
    } 
} 

Code za rozwiązaniem:

Jeśli nie chcesz korzystać z MVVM, można dodać użyj:

<ComboBox SelectionChanged="ComboBox_SelectionChanged" /> 

i dodać w MainWindow.xaml.cs:

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    // Some logic here 
} 
+1

Próbowałem tego, ale nie wyzwalałem zdarzenia zmiany selekcji. – Tanya

+1

Jak to sprawdzić? Nie powinieneś zasubskrybować zdarzenia kontrolnego w tym przypadku. – sll

+0

Nie powinno się uruchamiać zdarzenia, ponieważ logika dzieje się, gdy zamiast tego 'MySelectedItem' zmienia wartość. Zaktualizowałem swoją odpowiedź za pomocą funkcji obsługi zdarzeń, jeśli chcesz zamiast tego użyć tego. – snurre

1

Na początek wyjaśnijmy - nie możesz zmienić wydarzenia, a raczej możesz się zapisać.

Ponieważ nie podano żadnych informacji dotyczących miejsca, od którego chcesz obsługiwać zmiany wyboru, założę się najczęstszy scenariusz - obsługa w podstawowym ViewModel. Według MVVM ViewModel nie powinien nic wiedzieć o View, więc nie możesz zasubskrybować bezpośrednio z ViewModel do zdarzenia kontrolki View. Ale możesz powiązać właściwość ViewModel z SelectedItem lub SelectedIndex, aby zadziałał podczas zmiany wyboru.

<ComboBox 
     SelectedIndex="{Binding SelectedIndexPropertyName}" 
     ... /> 

Istnieją inne rozwiązania robi obsługi w kod związany z widokiem poprzez dostęp ViewModel poprzez view.DataContext ale proponuję unikać takich praktyk, to są prace wokół przypadków.

5

Twój ViewModel musi implementacja INotifyPropertyChanged.

public class MyViewModel : INotifyPropertyChanged 
{ 
    private string _mySelectedItem; 
    public string MySelectedItem 
    { 
     get 
     { 
      return _mySelectedItem; 
     } 
     set 
     { 
      if (_mySelectedItem != value) 
      { 
       _mySelectedItem = value; 
       // Perform any pre-notification process here. 
       if (null != PropertyChanged) 
       { 
        PropertyChanged(this, new PropertyChangedEventArgs("MySelectedItem")); 
       } 
      } 
     } 
    } 
} 

wcześniej pisał XAML jest poprawna:

<ComboBox ItemsSource="{Binding MyItems}" SelectedItem="{Binding MySelectedItem}"/> 
+0

Chociaż jest to dobra praktyka, nie pomaga w rozwiązaniu problemu. @Tanya chciała, aby jej kod w modelu widoku był powiadamiany, gdy użytkownik zmieni wybór z interfejsu w celu wykonania niektórych operacji. Powiadomienie o zmianie właściwości służy do przeciwnego działania. – Bishoy

1

Jestem wielkim fanem tej metody.

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 

<ComboBox Grid.Column="2" DisplayMemberPath="Data.name" ItemsSource="{Binding Model.Regions}" SelectedItem="{Binding Model.SelectedRegion}"> 
    <i:EventTrigger EventName="SelectionChanged"> 
     <i:InvokeCommandAction Command="{Binding RegionChangedCmd}" /> 
    </i:EventTrigger> 
</ComboBox> 
Powiązane problemy