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?
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?
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();
}
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.
});
Đó 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ó. –
@ H.B., Nó là đúng cho lớp 'EventTrigger'. Nhưng lớp 'EventToCommand' thuộc về MVVM Light Toolkit. –
Câu hỏi liên quan: http://stackoverflow.com/q/5868589/490018. –
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