I’m trying to use the search text box (which I made by following this tutorial: http://davidowens.wordpress.com/2009/02/18/wpf-search-text-box/).
I use MVVM & WPF. The above user control works when you write the “Search”-event in the code-behind file of the View, but I can’t get it to work with a command (using the ViewModel).
(The search-event fires when you haven’t typed something for about 2 seconds.)
I’ve tried using Caliburn, so it can “map” the view event to the viewmodel method. However when the event fires, the application crashes: “No target found for method SearchText().” on the RaiseSearchEvent method from the custom user control.
See the following test application: Test application
Could somebody tell me what I’m doing wrong? I told CaliBurn to do the following:
<i:Interaction.Triggers>
<i:EventTrigger EventName="Search">
<cal:ActionMessage MethodName="SearchText()" />
</i:EventTrigger>
</i:Interaction.Triggers>
So I figure this is correct. It means that when the “Search” event fires, caliburn will look for the method SearchText in the ViewModel. This doesn’t happen though, and it causes my app to crash and burn.
Do you know why? Or how I could solve this problem (doesn’t have to be with Caliburn).
I already tried adding “Extending Command Support” (http://msdn.microsoft.com/en-us/library/dd458928.aspx), but this is a little too complex for me :/
Thanks for any help!!
You are using the Caliburn’s ActionMessage but because you do not use its Bootstrapper class to start up your application, the MainView’s DataContext is not set to an instance of the MainViewModel. If you check the SearchTextBox’s DataContext at runtime, you’ll see it’s null.
Here’s a series of steps that may solve your problem (using your linked example project)
Create a class called MyBootstrapper. It should look like this
Add your new bootstrapper to the Application’s Resources collection, like I show below (App.xaml)
Not sure why, but if the bootstrapper isn’t nested in my build, it never is instantiated when App.InitializeComponent() is run…
Change App.xaml.cs to simply run InitializeComponent. Note that I had to tweak your build a bit to get this to work… InitializeComponent() is only defined in the App.g.cs file if you have the nested resource dictionary from step 2, or if you have an x:Name attribute on App.xaml, or perhaps other things…
Finally, you need to remove the parens as Wallstreet Programmer suggested.
Those steps should cause your App to instantiate your bootstrapper, which in turn instantates the MainViewModel as the root viewmodel of your application, and then create a MainView and hook up its DataContext to the MainViewModel. At that point, your application should work as expected.