我正在尝试使用搜索文本框(我通过遵循本教程:http://davidowens.wordpress.com/2009/02/18/wpf-search-text-box/)。
我使用MVVM &WPF。当您在视图的代码隐藏文件中编写"Search"事件时,上述用户控件可以工作,但我无法使用命令(使用ViewModel)使其工作。
(搜索事件在2秒内没有输入内容时会触发)
我试过使用Caliburn,所以它可以"映射"视图事件到视图模型方法。但是,当事件触发时,应用程序崩溃:在来自自定义用户控件的RaiseSearchEvent方法上"没有找到方法SearchText()的目标"。
查看下面的测试应用程序:测试应用程序
谁能告诉我我做错了什么?我告诉CaliBurn做以下操作:<i:Interaction.Triggers>
<i:EventTrigger EventName="Search">
<cal:ActionMessage MethodName="SearchText()" />
</i:EventTrigger>
</i:Interaction.Triggers>
所以我认为这是正确的。这意味着当"Search"事件触发时,caliburn将在ViewModel中查找SearchText方法。这不会发生,但它会导致我的应用程序崩溃和烧录。
你知道为什么吗?或者我如何解决这个问题(不一定是用Caliburn)。我已经尝试添加"扩展命令支持"(http://msdn.microsoft.com/en-us/library/dd458928.aspx),但这对我来说有点太复杂了:/
谢谢你的帮助!
你正在使用Caliburn的ActionMessage,但是因为你没有使用它的Bootstrapper类来启动你的应用程序,MainView的DataContext没有设置为MainViewModel的实例。如果你在运行时检查SearchTextBox的DataContext,你会看到它是空的。
这里有一系列的步骤可以解决你的问题(使用你的链接示例项目)
创建一个类MyBootstrapper。它应该是这样的
public class MyBootstrapper : Bootstrapper<MainViewModel> {}
将新的引导程序添加到应用程序的资源集合中,如下所示(App.xaml)
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplicationParadise"
x:Class="WpfApplicationParadise.App">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<local:MyBootstrapper x:Key="bootstrapper" />
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
不知道为什么,但如果引导程序没有嵌套在我的构建,它永远不会实例化时App.InitializeComponent()运行…
修改app . example .cs,直接运行InitializeComponent。请注意,我不得不调整你的构建一点,让这工作…InitializeComponent()只在App.g.cs文件中定义,如果你有从步骤2中嵌套的资源字典,或者如果你在App.xaml中有x:Name属性,或者其他东西…
using System.Windows;
namespace WpfApplicationParadise
{
public partial class App : Application
{
public App()
{
InitializeComponent();
}
}
}
最后,您需要删除父,正如wallstreetprogrammer建议的。
这些步骤应该导致你的应用实例化你的bootstrapper,它反过来实例化MainViewModel作为你的应用程序的根视图模型,然后创建一个MainView并将它的DataContext连接到MainViewModel。此时,您的应用程序应该可以正常工作。
Remove ()
<cal:ActionMessage MethodName="SearchText" />
在我运行你的应用程序后,我看到你需要初始化MainViewModel,也绑定文本的SearchTextBox与TekstBoxTekst。
后台代码>public partial class MainView : Window
{
public MainView()
{
InitializeComponent();
this.Loaded += (s, e) =>
{
this.DataContext = new MainViewModel();
};
}
}
XAML
<StackPanel>
<l:SearchTextBox
Text="{Binding TekstBoxTekst, UpdateSourceTrigger=PropertyChanged}"
Height="24" x:Name="TekstBoxTekst" Margin="145,144,145,143">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Search">
<cal:ActionMessage MethodName="SearchText">
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</l:SearchTextBox>
</StackPanel>