Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF: How to bind a command to the ListBoxItem using MVVM?

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.

like image 759
Boris Avatar asked Apr 04 '11 22:04

Boris


People also ask

How do I bind a list in WPF?

<ListView. View> <GridView> <GridViewColumn Header="Employee ID" DisplayMemberBinding="{Binding Path=EmployeeID}"/>

What is command binding in WPF?

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.


1 Answers

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 :)

like image 115
AbdouMoumen Avatar answered Sep 18 '22 18:09

AbdouMoumen