2012-02-24 27 views
5

Tôi muốn gọi một Lệnh khi một TabItem của TabControl của tôi được chọn.Sử dụng Lệnh với TabItem

Có cách nào để làm điều đó mà không vi phạm mẫu MVVM không?

+1

Bạn cũng có thể liên kết với IsSelected và xử lý các thay đổi đối với thuộc tính đó i n ViewModel của bạn. – Will

Trả lời

6

Sử dụng một AttachedCommand Behavior, mà sẽ cho phép bạn liên kết một Command để WPF sự kiện

<TabControl ... 
    local:CommandBehavior.Event="SelectionChanged" 
    local:CommandBehavior.Command="{Binding TabChangedCommand}" /> 

Tất nhiên, nếu bạn đang sử dụng các mẫu thiết kế MVVM và ràng buộc SelectedItem hoặc SelectedIndex, bạn cũng có thể chạy các lệnh trong sự kiện PropertyChanged

void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "SelectedIndex") 
     RunTabChangedLogic(); 
} 
5

Nó có thể được thực hiện bằng cách sử dụng các lớp học sau cùng:

  • EventTrigger lớp học từ không gian tên System.Windows.Interactivity (lắp ráp System.Windows.Interactivity).
  • EventToCommand lớp từ GalaSoft.MvvmLight.Command namespace (MVVM Light Toolkit lắp ráp, ví dụ, GalaSoft.MvvmLight.Extras.WPF4):

XAML:

<Window ... 
     xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
     xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command 
     ...> 
... 
    <TabControl> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="SelectionChanged"> 
       <cmd:EventToCommand Command="{Binding TabSelectionChangedCommand}" 
            PassEventArgsToCommand="True" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 

     <TabItem>...</TabItem> 
     <TabItem>...</TabItem> 
    </TabControl> 
... 
</Window> 

Tạo một thể hiện của các lệnh trong constructor ViewModel:

TabSelectionChangedCommand = new RelayCommand<SelectionChangedEventArgs>(args => 
    { 
     // Command action. 
    }); 
+1

Đó chỉ là 'Tương tác 'từ [Blend SDK] (http://www.microsoft.com/download/en/details.aspx?id=10801), bạn không cần bất kỳ khung MVVM nào để sử dụng nó. –

+0

@ H.B., Nó là đúng cho lớp 'EventTrigger'. Nhưng lớp 'EventToCommand' thuộc về MVVM Light Toolkit. –

+0

Câu hỏi liên quan: http://stackoverflow.com/q/5868589/490018. –

Các vấn đề liên quan