2017-08-17 3 views
0

Hier ist mein einfaches Testprojekt, um Caliburn.Micro + UWP zu testen.UWP, C#, Caliburn.Micro Sprudelnd .... Wie man sprudelt?

enter image description here

Es gibt 2-Taste.

  • Speichern: Es macht Aktion auf HelloViewModel. (Es funktionierte:)
  • Blase sparen? Ich erwarte, dass es Wirkung auf ParentViewModel, aber nicht arbeiten ... :(

Können Sie mir geben Sie Ihre Idee Warum ???

Here is project file on Github.

Zuerst ist HelloViewMode Code. Diese Arbeit gut.

public void Save() 
    { 
     Debug.WriteLine("Click Save"); 
    } 

2. ist ParentViewMode Code. Dies funktioniert nicht ... ich frage mich, ...

public void BubbleSave() 
    { 
     Debug.WriteLine("Click BubbleSave"); 
    } 

und HelloView XAML-Code ist hier.

 <Button x:Name="Save" Content="SaveButton" Margin="30"/> 
     <Button x:Name="BubbleSave" Content="Bubble SaveButton" Margin="30"/> 

Ich erwartete, BubbleSave genannt werden .... aber nicht angerufen werden.

Vielen Dank für Ihre Hilfe.

+0

Paste hier nur einen entsprechenden Code und beschreiben, was nicht funktioniert. – FCin

+0

Ich habe einen Hauptcode in Frage gestellt. Vielen Dank ! –

+0

Ihr 'BubbleSave' ist in einer anderen Klasse. Wie also erwarten Sie, dass es funktioniert? – FCin

Antwort

2

Grundsätzlich möchten Sie Eltern mitteilen, dass BubbleSave gedrückt wurde. Deine Kindklasse weiß nichts über deine Eltern, also kann sie es nicht nennen. Lösung hier ist entweder eine Schnittstelle oder ein Ereignis zu erstellen. Ich kann sehen, dass Sie die Abhängigkeitsinjektion verwenden.

Ihr HelloViewModel muss ein wenig über seine Eltern wissen. Es muss wissen, dass BubbleSave vorhanden ist, so können Sie Schnittstelle erstellen:

public interface IBubbleSave { 
    void BubbleSave(); 
} 

und weist es ParentViewModel:

public class ParentViewModel: Conductor<object>, IBubbleSave 

Das Kind diese Schnittstelle die Methode aufzurufen zu können, benötigen sollte.

public class HelloViewModel : Screen 
{ 
    private readonly IBubbleSave _bubbleSave; 
    public HelloViewModel(IBubbleSave bubbleSave) { 
     _bubbleSave = bubbleSave; 
    } 
    public void Save() 
    { 
     Debug.WriteLine("Click Save"); 
    } 
    public void BubbleSave() 
    { 
     _bubbleSave.BubbleSave(); 
    } 
} 

Sie müssen auch die Abhängigkeit registrieren für IBubbleSave in Ihrem App.xaml.cs


Zweite Art und Weise, dies zu tun, an Veranstaltungen nutzen.

Ihr HelloViewModel kann Ereignis aussetzen, dass die Mutter abonniert:

public class HelloViewModel : Screen 
{ 
    public event EventHandler BubbleSavePressedEvent; 
    public void Save() 
    { 
     Debug.WriteLine("Click Save"); 
    } 

    public void BubbleSave() 
    { 
     BubbleSavePressedEvent?.Invoke(); 
    } 
} 

public class ParentViewModel : Conductor<object> 
{ 
    HelloViewModel _helloViewModel; 

    public ParentViewModel(HelloViewModel helloViewModel) 
    { 
     _helloViewModel = helloViewModel; 
     _helloViewModel.BubbleSavePressedEvent += BubbleSave; 

     ActivateItem(_helloViewModel); 
    } 

    public void BubbleSave() 
    { 
     Debug.WriteLine("Click BubbleSave"); 
    } 
}