Использование команды в пользовательском элементе управления - PullRequest
1 голос
/ 27 октября 2011

Я пытаюсь использовать текстовое поле поиска (которое я сделал, следуя этому уроку: http://davidowens.wordpress.com/2009/02/18/wpf-search-text-box/).

Я использую MVVM & WPF. Вышеупомянутый пользовательский элемент управления работает, когда вы пишете "Поиск" -событие в файле с выделенным кодом в представлении, но я не могу заставить его работать с командой (используя ViewModel).

(Событие поиска срабатывает, когда вы ничего не набрали в течение примерно2 секунды.)

Я пытался использовать Caliburn, чтобы он мог «сопоставить» событие представления с методом viewmodel. Однако при возникновении события происходит сбой приложения: «Не найдена цель для метода SearchText (). "о методе RaiseSearchEvent из пользовательского элемента управления.

См. следующее тестовое приложение: Тестовое приложение

Может кто-нибудь сказать мне, что я делаю неправильно? Явелел CaliBurn сделать следующее:

<i:Interaction.Triggers>
        <i:EventTrigger EventName="Search">
            <cal:ActionMessage MethodName="SearchText()" />
        </i:EventTrigger>
</i:Interaction.Triggers>

Так что я считаю, что это правильно. Это означает, что когда срабатывает событие «Поиск», caliburn будет искать метод SearchText во ViewModel. Этого не происходит.хотя, и это вызываетМое приложение зависает и горит.

Знаете почему?Или как я мог решить эту проблему (не обязательно с Caliburn).Я уже пытался добавить «Расширение поддержки команд» (http://msdn.microsoft.com/en-us/library/dd458928.aspx),, но это для меня слишком сложно: /

Спасибо за любую помощь !!

Ответы [ 3 ]

1 голос
/ 28 октября 2011

Вы используете ActionMessage Caliburn, но, поскольку вы не используете его класс Bootstrapper для запуска вашего приложения, DataContext MainView не установлен на экземпляр MainViewModel.Если вы проверите DataContext в SearchTextBox во время выполнения, вы увидите, что он имеет значение null.

Вот серия шагов, которые могут решить вашу проблему (используя связанный пример проекта)

Создайте класс с именем 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.xaml.cs, чтобы просто запустить InitializeComponent.Обратите внимание, что мне пришлось немного настроить вашу сборку, чтобы заставить это работать ... InitializeComponent () определяется только в файле App.g.cs, если у вас есть словарь вложенных ресурсов из шага 2 или если у вас есть x:Атрибут имени в App.xaml или, возможно, другие вещи ...

using System.Windows;

namespace WpfApplicationParadise
{
    public partial class App : Application
    {
        public App()
        {
            InitializeComponent();
        }
    }
}

Наконец, вам нужно удалить парены , как предложил Wallstreet Programmer.

Эти шагидолжно заставить ваше приложение создавать экземпляр вашего загрузчика, который, в свою очередь, создает MainViewModel как корневую модель представления вашего приложения, а затем создает MainView и подключает свой DataContext к MainViewModel.На этом этапе ваше приложение должно работать как положено.

0 голосов
/ 27 октября 2011

После запуска приложения я вижу, что вам нужно инициализировать MainViewModel, а также связать текст SearchTextBox с TekstBoxTekst.

Codebehind

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>
0 голосов
/ 27 октября 2011

Удалить ()

<cal:ActionMessage MethodName="SearchText" />
...