Выкарыстоўваючы каманду карыстацкага элемента кіравання

Я спрабую выкарыстоўваць пошук тэкставага поле (якое я зрабіў, вынікаючы гэты навучальны курс: 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).

(Пажараў пошукава-падзей, калі вы не набралі што-то на працягу каля 2 секунд.)

Я паспрабаваў з дапамогай Caliburn, так што ён можа «карту» падзея выгляду да метаду ViewModel. Аднак, калі спрацоўвае падзея, збой прыкладання: «Не мішэні знойдзена для метаду SearchText ().» па метадзе RaiseSearchEvent ад кантролю карыстацкага карыстальніка.

See the following test application: Test application

Можа хто-небудзь сказаць мне, што я раблю няправільна? Я сказаў Caliburn зрабіць наступнае:


        
            
        

Таму я мяркую, што гэта правільна. Гэта азначае, што, калі «Пошук» пажараў падзей, Caliburn будзе шукаць спосаб SearchText ў ViewModel. Гэтага не адбываецца, хоць, і гэта выклікае маё прыкладанне да збою і спаліць.

Вы ведаеце, чаму? Ці як я магу вырашыць гэтую праблему (не павінен быць з Caliburn). Я ўжо спрабаваў дадаць «Пашырэнне каманды падтрымкі» ( http://msdn.microsoft.com /en-us/library/dd458928.aspx ), але гэта крыху занадта складаным для мяне: /

Дзякуй за любую дапамогу !!

1

3 адказы

Вы карыстаецеся ActionMessage ў Caliburn, але таму, што вы не выкарыстоўваеце свой клас Загрузнік для запуску прыкладання, DataContext ў MainView не ўстаноўлены на асобнік MainViewModel. Калі праверыць DataContext ў SearchTextBox падчас выканання, вы ўбачыце, што гэта нуль.

Вось шэраг крокаў, якія могуць вырашыць вашу праблему (выкарыстоўваючы звязаны прыклад праекта)

Стварыце клас MyBootstrapper. Ён павінен выглядаць наступным чынам

public class MyBootstrapper : Bootstrapper {}

Дадайце новы загрузнік ў калекцыі рэсурсаў прыкладання, як я пакажу ніжэй (App.xaml)


    
        
            
                
                    
                
            
        
    

Не ведаю, чаму, але калі Загрузнік ня укладзены ў маёй зборкі, ён ніколі не канкрэтызуецца, калі App.InitializeComponent() выконваецца ...

Змена App.xaml.cs проста запусціць InitializeComponent. Звярніце ўвагу, што я павінен быў наладзіць ваш білд трохі, каб атрымаць гэтую працу ... InitializeComponent() вызначаецца толькі ў App.g.cs файл, калі ў вас ёсць укладзены слоўнік рэсурсаў, пачынаючы з кроку 2, або калі ў вас ёсць х: Імя атрыбуту App.xaml, або, магчыма, іншыя рэчы ...

using System.Windows;

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

Нарэшце, <�моцны> Вы павінны выдаліць дужкі як прапанавана Wallstreet праграміст.

Гэтыя крокі павінны прывесці да таго, каб App стварыць асобнік загрузнік, які, у сваю чаргу, instantates ў MainViewModel ў якасці каранёвага ViewModel вашага прыкладання, а затым стварыць MainView і падключыць яго да DataContext MainViewModel. У гэты момант ваша прыкладанне павінна працаваць, як чакалася.

1
дададзена
Вялікі дзякуй Адрыяна! Ён працуе, як ён павінен :) Я вельмі цаню, што вы знайшлі час, каб выпрацаваць рашэнне. Мая памылка была ў тым, што я меркаваў (гл, што там я не заладзіўся), што Загрузнік не зрабіў нічога, што мой App.xaml не рабіў, якое ставіць акно запуску. Я памятаю гэта, таму што Caliburn выглядае як сапраўдны зручны інструмент :)
дададзена аўтар Team-JoKi, крыніца
Вы вельмі вітаем. Caliburn.Micro вялікі.
дададзена аўтар Adrian, крыніца

Выдаліць ()


0
дададзена
Дзякуй за адказ! На жаль, я ўжо спрабаваў, гэта не выправіць гэтую праблему для мяне. Спрабавалі Ці вы запусціць прыклад?
дададзена аўтар Team-JoKi, крыніца

Пасля таго, як я запусціць прыкладанне, я бачу, што вы павінны ініцыялізаваць MainViewModel, а таксама звязаць Тэкст SearchTextBox з TekstBoxTekst.

<�Моцны> Codebehind

public partial class MainView : Window
{
    public MainView()
    {
        InitializeComponent();
        this.Loaded += (s, e) =>
                        {
                            this.DataContext = new MainViewModel();
                        };
    }
}

<�Моцны> XAML


    
        
            
                
                
            
        
    

0
дададзена
devdigital правоў, Caliburn клапоціцца аб усіх гэтых рэчах. Дзякуй за цікавасць, хоць :)
дададзена аўтар Team-JoKi, крыніца
Вы не павінны папрасіць прабачэння:/Я ўдзячны, што вы спрабавалі
дададзена аўтар Team-JoKi, крыніца
Вы не павінны быць відавочна усталёўваючы кантэкст дадзеных прадстаўлення ў кодзе пры выкарыстанні Caliburn.Micro. Ні вы не павінны патрабаваць выразных прывязак Пры выкарыстанні канвенцый.
дададзена аўтар devdigital, крыніца
@ Team-Йоки: О, я не ведаю Caliburn і проста падумаў, як агульны WPF, але мой код працуе добра, гэтая кропка кажа вам дзве рэчы-налады DataContext і звязвання тэксту нешта не так. Выбачайце за парушэнне.
дададзена аўтар Jin-Wook Chung, крыніца