I have just started learning MVVM. I've made the application from scratch by following this MVVM tutorial (I highly recommend it to all MVVM beginners out there). Basically, what I have created so far is a couple of text boxes where user adds his or her data, a button to save that data which subsequently populates the ListBox with all entries made.
Here's where I got stuck: I want to be able to double-click on a ListBoxItem and to trigger a command that I have created and added to my ViewModel. I don't know how to finish the XAML side, i.e. I don't know how to bind that command to the ListBox(Item).
Here's XAML:
... <ListBox Name="EntriesListBox" Width="228" Height="208" Margin="138,12,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" ItemsSource="{Binding Entries}" /> ...
Here's ViewModel:
public class MainWindowViewModel : DependencyObject { ... public IEntriesProvider Entries { get { return entries; } } private IEntriesProvider entries; public OpenEntryCommand OpenEntryCmd { get; set; } public MainWindowViewModel(IEntriesProvider source) { this.entries = source; ... this.OpenEntryCmd = new OpenEntryCommand(this); } ... }
And finally, here's the OpenEntryCommand that I want to be executed once the user double-clicks the item in the EntriesListBox:
public class OpenEntryCommand : ICommand { private MainWindowViewModel viewModel; public OpenEntryCommand(MainWindowViewModel viewModel) { this.viewModel = viewModel; } public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } public bool CanExecute(object parameter) { return parameter is Entry; } public void Execute(object parameter) { string messageFormat = "Subject: {0}\nStart: {1}\nEnd: {2}"; Entry entry = parameter as Entry; string message = string.Format(messageFormat, entry.Subject, entry.StartDate.ToShortDateString(), entry.EndDate.ToShortDateString()); MessageBox.Show(message, "Appointment"); } }
Please help, I'd appreciate it.
<ListView. View> <GridView> <GridViewColumn Header="Employee ID" DisplayMemberBinding="{Binding Path=EmployeeID}"/>
The command is the action to be executed. The command source is the object which invokes the command. The command target is the object that the command is being executed on. The command binding is the object which maps the command logic to the command.
Unfortunately, only ButtonBase
derived controls have the possibility for binding ICommand
objects to their Command
properties (for the Click
event).
However, you can use an API provided by Blend to map an event (like in your case MouseDoubleClick
on the ListBox
) to an ICommand
object.
<ListBox> <i:Interaction.Triggers> <i:EventTrigger EventName="MouseDoubleClick"> <i:InvokeCommandAction Command="{Binding YourCommand}"/> </i:EventTrigger> </i:Interaction.Triggers> </ListBox>
You'll have to define: xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
and have a reference to System.Windows.Interactivity.dll
.
-- EDIT -- This is part of WPF4, but u can use Microsoft.Windows.Interactivity if you're not using WPF4. This dll is from Blend SDK, which doesn't require Blend, from here: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=f1ae9a30-4928-411d-970b-e682ab179e17&displaylang=en
Update: I found something that should help you. check this link on MVVM Light Toolkit which contains a walkthrough on how to do this, along with a link to the needed libraries. MVVM Light Toolkit is a very interesting framework for applying MVVM with Silverlight, WPF, and WP7.
Hope this helps :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With