Een commando gebruiken op een aangepast besturingselement

Ik probeer het zoekvak te gebruiken (dat ik heb gemaakt door deze zelfstudie te volgen: 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).

(De zoekactie wordt gestart wanneer u ongeveer 2 seconden lang niets hebt getypt.)

Ik heb geprobeerd Caliburn te gebruiken, zodat het de kijkgebeurtenis kan 'in kaart brengen' met de methode viewmodel. Wanneer de gebeurtenis wordt geactiveerd, loopt de toepassing echter vast: "Geen doel gevonden voor methode SearchText ()." op de RaiseSearchEvent-methode vanuit het aangepaste gebruikersbeheer.

See the following test application: Test application

Kan iemand me vertellen wat ik verkeerd doe? Ik heb CaliBurn gezegd om het volgende te doen:


        
            
        

Dus ik denk dat dit correct is. Dit betekent dat wanneer het "Search" -gebeurtenis start, Caliburn zoekt naar de methode SearchText in het ViewModel. Dit gebeurt echter niet en het zorgt ervoor dat mijn app crasht en brandt.

Weet u waarom? Of hoe ik dit probleem zou kunnen oplossen (hoeft niet bij Caliburn te zijn). Ik heb al geprobeerd "Uitbreiding van Command-ondersteuning" toe te voegen ( http://msdn.microsoft.com /en-us/library/dd458928.aspx ), maar dit is een beetje te complex voor mij: /

Bedankt voor alle hulp !!

1

3 antwoord

U gebruikt de ActionMessage van Caliburn, maar omdat u de Bootstrapper-klasse niet gebruikt om uw toepassing op te starten, is de DataContext van de MainView niet ingesteld op een instantie van het MainView-model. Als u de DataContext van de SearchTextBox tijdens runtime controleert, ziet u dat deze null is.

Hier is een reeks stappen die uw probleem kunnen oplossen (met behulp van uw gekoppelde voorbeeldproject)

Maak een klasse genaamd MyBootstrapper. Het zou er zo uit moeten zien

public class MyBootstrapper : Bootstrapper {}

Voeg je nieuwe bootstrapper toe aan de Resources-verzameling van de applicatie, zoals ik hieronder laat zien (App.xaml)


    
        
            
                
                    
                
            
        
    

Niet zeker waarom, maar als de bootstrapper niet in mijn build is genest, wordt deze nooit geïnstantieerd wanneer App.InitializeComponent() wordt uitgevoerd ...

Wijzig App.xaml.cs om eenvoudig InitializeComponent uit te voeren. Merk op dat ik je build een beetje moest aanpassen om dit te laten werken ... InitializeComponent() is alleen gedefinieerd in het App.g.cs-bestand als je het geneste hulpmiddelendocument uit stap 2 hebt, of als je een x hebt: Naamkenmerk op App.xaml of misschien andere dingen ...

using System.Windows;

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

Tot slot, moet u de parens verwijderen zoals door Wallstreet Programmer werd gesuggereerd.

Deze stappen zouden ervoor moeten zorgen dat je App een instantboot opstart met je bootstrapper, die op zijn beurt het MainViewModel instantiseert als het rootviewmodel van je applicatie, en vervolgens een MainView maakt en zijn DataContext koppelt aan het MainViewModel. Op dat moment zou uw applicatie moeten werken zoals verwacht.

1
toegevoegd
Heel erg bedankt Adrian! Het werkt zoals het hoort :) Ik waardeer het enorm dat je de tijd hebt genomen om de oplossing uit te werken. Mijn fout was dat ik aannam (zie, daar ging ik fout) dat de bootstrapper niets anders deed dan mijn app.xaml niet deed, wat een opstartvenster is. Ik zal dit onthouden, omdat CaliBurn eruit ziet als een echt handig hulpmiddel :)
toegevoegd de auteur Team-JoKi, de bron
Heel graag gedaan. Caliburn.Micro is geweldig.
toegevoegd de auteur Adrian, de bron

Verwijderen ()


0
toegevoegd
Dank je voor het antwoord! Helaas heb ik dat al geprobeerd, dat lost het probleem niet voor mij op. Heb je het voorbeeld geprobeerd?
toegevoegd de auteur Team-JoKi, de bron

Nadat ik uw toepassing heb uitgevoerd, zie ik dat u het MainView-model moet initialiseren en ook de tekst van SearchTextBox moet binden met TekstBoxTekst.

codebehind

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

XAML


    
        
            
                
                
            
        
    

0
toegevoegd
devdigital heeft gelijk, Caliburn zorgt voor al die dingen. Bedankt voor de interesse :)
toegevoegd de auteur Team-JoKi, de bron
Je hoeft je niet te verontschuldigen:/Ik ben dankbaar dat je hebt geprobeerd
toegevoegd de auteur Team-JoKi, de bron
U moet niet expliciet de gegevenscontext van de weergave coderen als u Caliburn.Micro gebruikt. Evenmin zou u expliciete bindingen nodig hebben als u conventies gebruikt.
toegevoegd de auteur devdigital, de bron
@ Team-JoKi: Oh, ik ken Caliburn niet en dacht gewoon als algemene WPF, maar omdat mijn code goed werkt, vertelt dit punt je de twee dingen - instellingen datacontext en bindende tekst - iets mis. Sorry voor de overlast.
toegevoegd de auteur Jin-Wook Chung, de bron