2011-12-29 79 views

Trả lời

35

giải pháp MVVM:

Bind các ItemsSourceSelectedItem thuộc tính của ComboBox để tài sản trong ViewModel của bạn:

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

Trong MainViewModel.cs:

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

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

số- đằng sau giải pháp:

Nếu bạn không muốn sử dụng MVVM, bạn có thể thêm sử dụng này:

<ComboBox SelectionChanged="ComboBox_SelectionChanged" /> 

Và thêm này trong MainWindow.xaml.cs:

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

tôi đã thử cách này nhưng không kích hoạt sự kiện đã thay đổi lựa chọn. – Tanya

+1

Bạn đã kiểm tra điều này như thế nào? Bạn không nên đăng ký một sự kiện kiểm soát trong trường hợp này – sll

+0

Nó không phải là để kích hoạt sự kiện, vì logic xảy ra khi 'MySelectedItem' thay đổi giá trị thay thế. Tôi đã cập nhật câu trả lời của tôi với một trình xử lý sự kiện, nếu bạn muốn sử dụng nó để thay thế. – snurre

1

Trước tiên, hãy làm rõ mọi thứ - bạn không thể thay đổi sự kiện thay vì bạn có thể đăng ký.

Vì bạn không cung cấp bất kỳ thông tin nào về việc bạn muốn xử lý các thay đổi lựa chọn, tôi sẽ giả định hầu hết các trường hợp phổ biến - xử lý trong ViewModel cơ bản. Theo MVVM ViewModel không nên biết gì về View vì vậy bạn không thể đăng ký trực tiếp từ ViewModel đến sự kiện của View control. Nhưng bạn có thể liên kết thuộc tính của ViewModel với SelectedItem hoặc SelectedIndex để nó kích hoạt trong khi thay đổi lựa chọn.

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

Có nhiều giải pháp khác làm xử lý trong mã phía sau của một Xem bằng cách truy cập một ViewModel qua view.DataContext nhưng tôi sẽ đề nghị tránh thực hành như vậy, đây là công trình xung quanh trường hợp.

5

ViewModel của bạn cần triển khai 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")); 
       } 
      } 
     } 
    } 
} 

Các posted trước XAML là đúng:

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

Mặc dù đây là một thực hành tốt, nhưng nó không giúp giải quyết vấn đề. @Tanya muốn mã của cô ấy trong mô hình xem được thông báo khi người dùng thay đổi lựa chọn từ giao diện người dùng để thực hiện một số thao tác tương ứng. Thông báo thay đổi tài sản được sử dụng để làm điều ngược lại. – Bishoy

1

Tôi là một fan hâm mộ lớn của phương pháp này.

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> 
Các vấn đề liên quan