在自定义控件上使用命令



我正在尝试使用搜索文本框(我通过遵循本教程: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>

相关内容

  • 没有找到相关文章

最新更新