Đối với những người quan tâm đến việc duy trì hầu hết mô hình MVVM, tôi đã sử dụng câu trả lời của Andreas Grech để giải quyết vấn đề.
Luồng cơ bản:
Người dùng nhấp đúp vào mục -> Trình xử lý sự kiện trong mã phía sau -> ICommand trong mô hình xem
ProjectView.xaml:
<UserControl.Resources>
<Style TargetType="ListViewItem" x:Key="listViewDoubleClick">
<EventSetter Event="MouseDoubleClick" Handler="ListViewItem_MouseDoubleClick"/>
</Style>
</UserControl.Resources>
...
<ListView ItemsSource="{Binding Projects}"
ItemContainerStyle="{StaticResource listViewDoubleClick}"/>
ProjectView.xaml.cs:
public partial class ProjectView : UserControl
{
public ProjectView()
{
InitializeComponent();
}
private void ListViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
((ProjectViewModel)DataContext)
.ProjectClick.Execute(((ListViewItem)sender).Content);
}
}
ProjectViewModel.cs:
public class ProjectViewModel
{
public ObservableCollection<Project> Projects { get; set; } =
new ObservableCollection<Project>();
public ProjectViewModel()
{
}
public ICommand ProjectClick
{
get { return new DelegateCommand(new Action<object>(OpenProjectInfo)); }
}
private void OpenProjectInfo(object _project)
{
ProjectDetailView project = new ProjectDetailView((Project)_project);
project.ShowDialog();
}
}
DelegateCommand.cs có thể được tìm thấy ở đây .
Trong ví dụ của tôi, tôi có một tập hợp các Project
đối tượng điền vào ListView
. Các đối tượng này chứa nhiều thuộc tính hơn được hiển thị trong danh sách và tôi mở một ProjectDetailView
(một WPF Window
) để hiển thị chúng.
Đối sender
tượng của trình xử lý sự kiện được chọn ListViewItem
. Sau đó, cái Project
mà tôi muốn truy cập được chứa trong thuộc Content
tính.