ज्यादातर एमवीवीएम पैटर्न को बनाए रखने के इच्छुक लोगों के लिए, मैंने काम करने के लिए एंड्रियास ग्रीच के उत्तर का उपयोग किया ।
मूल प्रवाह:
उपयोगकर्ता डबल-क्लिक आइटम -> कोड के पीछे इवेंट हैंडलर -> दृश्य मॉडल में 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
संपत्ति तक पहुंच हो ।