주로 MVVM 패턴을 유지하는 데 관심이있는 사람들을 위해 Andreas Grech의 답변 을 사용하여 해결 방법을 만들었습니다.
기본 흐름 :
사용자가 항목-> 코드 숨김의 이벤트 처리기->보기 모델의 ICommand를 두 번 클릭합니다.
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는 여기 에서 찾을 수 있습니다 .
제 경우 Project
에는 ListView
. 이러한 개체에는 목록에 표시된 것보다 더 많은 속성이 포함되어 있으며 ProjectDetailView
(WPF Window
)를 열어 표시합니다.
sender
이벤트 핸들러 의 개체가 선택 ListViewItem
됩니다. 결과적으로 Project
액세스하려는이 Content
속성에 포함됩니다 .