2016-04-18 8 views
1

Ich habe folgendes Dummy Ansicht Modell:Warum wird WhenAnyValue Observable im Abonnement ausgelöst?

public class DummyViewModel : ReactiveObject 
{ 
    internal DummyViewModel() 
    { 
     ItemChanged.Subscribe(_ => Console.WriteLine()); 
    } 

    public IObservable<string> ItemChanged 
    { 
     get { return this.WhenAnyValue(x => x.Item).Select(s => s); } 
    } 

    private string _item; 

    public string Item 
    { 
     get { return _item; } 
     set { this.RaiseAndSetIfChanged(ref _item, value); } 
    } 
} 

Wenn ich eine neue Instanz dieser Klasse erstellen, die beobachtbaren Feuer sofort auf Abonnement, Rückkehr null (nichts zu Punkt gebunden). Dies verursacht ein Problem in meinen fortgeschritteneren Ansichtsmodellen, in denen ich mehrere Observablen habe, die ich auf verschiedene Arten verketten muss. Ich habe eine Kombination aus Skip und StartWith verwendet, aber es wird ziemlich kompliziert. Kann jemand raten, warum dies geschieht und ob es einen anderen Ansatz gibt, den ich berücksichtigen sollte?

Antwort

3

Ich denke, es ist nur "von Design". WhenAny und Freunde geben immer den Anfangswert zurück. Dies ist in den meisten Fällen sinnvoll - zum Beispiel, wenn Sie am Ende ToProperty verwenden und normalerweise möchten, dass Ihre Eigenschaft den Anfangswert hat.

Offensichtlich kenne ich nicht die Details Ihrer App, aber ich habe zwei Apps von einiger Größe und kann mir keine Zeit vorstellen, die ich brauchte, um den Anfangswert zu überspringen.

Intern, WhenAny Delegaten zu ObservableForProperty und ObservableForProperty hat eine skipInitial Argument. So könnte man das benutzen. Oder einfach .Skip(1).

+0

Verstanden, danke. Ich habe Objekte, die implementieren IEditableObject BeginEdit() muss nur aufgerufen werden, wenn der Benutzer eine Änderung vornimmt, aber nicht vorher, daher die Herausforderung mit Auslösen auf den Anfangswert. Ich benutze weiterhin Skip (1) - wollte nur sicherstellen, dass ich nicht etwas Offensichtliches verpasse. – ket

Verwandte Themen