2017-06-05 3 views
0

Ich beginne gerade mit Caliburn Micro und versuche, meinen Kopf um IResult zu wickeln. Um dies zu tun, habe ich Dummy-Code geschrieben. Der Code soll "Laden ..." in einem Textfeld anzeigen, bis eine langwierige Operation (Task.Delay) abgeschlossen ist, an welcher Stelle der Text verschwinden sollte. Hier ist mein Code:Caliburn Micro - Verwenden von IResult und Rendern von Ansichten

Ansichtsmodell:

[Export(typeof(IShell))] 
public class ShellViewModel : IShell 
{ 
    public string MyMessage { get; set; } 

    public IEnumerable<IResult> DoSomething() 
    { 
     yield return Loader.Show("Loading..."); 
     yield return Task.Delay(1000).AsResult(); 
     yield return Loader.Hide(); 
    } 
} 

Ausblick:

<Window x:Class="CaliburnMicroTest.ShellView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:CaliburnMicroTest" 
     xmlns:cal="http://www.caliburnproject.org" 
     mc:Ignorable="d" 
     Title="ShellView" Height="300" Width="300"> 
    <StackPanel> 
     <Button Content="Do Something" 
       x:Name="DoSomething" /> 
     <TextBox Text="{Binding Path=MyMessage, Mode=TwoWay}"/> 
    </StackPanel> 
</Window> 

Loader-Klasse:

public class Loader : IResult 
{ 
    readonly string message; 
    readonly bool hide; 

    public Loader(string message) 
    { 
     this.message = message; 
    } 

    public Loader(bool hide) 
    { 
     this.hide = hide; 
    } 

    public event EventHandler<ResultCompletionEventArgs> Completed; 

    public void Execute(CoroutineExecutionContext context) 
    { 
     var target = context.Target as ShellViewModel; 

     target.MyMessage = hide ? string.Empty : message; 

     Completed(this, new ResultCompletionEventArgs()); 
    } 

    public static IResult Show(string message = null) 
    { 
     return new Loader(message); 
    } 

    public static IResult Hide() 
    { 
     return new Loader(true); 
    } 
} 

Wenn ich auf die Schaltfläche klicken, ich erwarte, dass die Textbox gefüllt werden mit "Loading ..." für eine Sekunde und dann wieder leer, aber nichts erscheint in der Textbox. Beim Debuggen hat die MyMessage-Eigenschaft in meinem ViewModel außerdem den Wert "Loading ...". Warum sollte der Text nicht in meiner Sicht erscheinen?

+0

Bitte beachten Sie hilfreiche Antworten stimmen up :) https://stackoverflow.com/help/privileges/vote-up – mm8

Antwort

1

sollte Ihre Ansicht Modellklasse von PropertyChangedBase erben und Änderungsbenachrichtigungen erhöhen:

[Export(typeof(IShell))] 
public class ShellViewModel : IShell, PropertyChangedBase 
{ 
    string _myMessage; 
    public string MyMessage 
    { 
     get { return _myMessage; } 
     set 
     { 
      _myMessage = value; 
      NotifyOfPropertyChange(() => MyMessage); 
     } 
    } 

    public IEnumerable<IResult> DoSomething() 
    { 
     yield return Loader.Show("Loading..."); 
     yield return Task.Delay(1000).AsResult(); 
     yield return Loader.Hide(); 
    } 
} 
Verwandte Themen