wake-up-neo.com

WPF-Bindung aktualisiert die Ansicht nicht

Ich habe einen Textblock:

<TextBlock HorizontalAlignment="Left" Name="StatusText" Margin="0,20" TextWrapping="Wrap" Text="{Binding StatusText}">
            ... Status ...
</TextBlock>

codebehind:

public StatusPage()
{
    InitializeComponent();
    this.DataContext = new StatusPageViewModel(this);
}

und in viewModel:

private string _statusText;
/// <summary>
/// Status text
/// </summary>
public string StatusText
{
    get { return _statusText; }
    set { _statusText = value; }
}

und in Funktion in viewModel:

string statusText = Status.GetStatusText();
this.StatusText = statusText;

GetStatusText() gibt eine Zeichenfolge wie "Arbeit erledigt" usw. zurück. Werte von diesen Funktionen werden dem this.StatusText zugewiesen, aber die Text-Eigenschaft des TextBlocks ändert sich nicht und zeigt immer noch Platzhalter "... Status ..." an.

Mir sind Fragen wie diese bekannt -> KLICKEN SIE AUF <---, aber nachdem ich dies gelesen habe, kann ich immer noch keine Lösung finden

@Aktualisieren

Nach Ihren Vorschlägen habe ich meinen Code aktualisiert und nun habe ich folgendes:

public string StatusText
{
    get 
    {
        return _statusText;
    }
    set 
    {
        _statusText = value; 
        RaisePropertyChanged("StatusText");
    }
}

und Erklärung von viewModel:

 public class StatusPageViewModel : ObservableObject, INavigable

woher:

Die ObservableObject-Klasse lautet:

public abstract class ObservableObject : INotifyPropertyChanged
{
    #region INotifyPropertyChanged Members

    /// <summary>
    /// Raises the PropertyChange event for the property specified
    /// </summary>
    /// <param name="propertyName">Property name to update. Is case-sensitive.</param>
    public virtual void RaisePropertyChanged(string propertyName)
    {
        OnPropertyChanged(propertyName);
    }

    /// <summary>
    /// Raised when a property on this object has a new value.
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// Raises this object's PropertyChanged event.
    /// </summary>
    /// <param name="propertyName">The property that has a new value.</param>
    protected virtual void OnPropertyChanged(string propertyName)
    {

        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }

    #endregion // INotifyPropertyChanged Members
}

Aber es funktioniert immer noch nicht

16
szpic

Sie müssen INotifyPropertyChanged in Ihrer ViewModel-Reihenfolge implementieren, um die Ansicht zu benachrichtigen, dass sich die Eigenschaft geändert hat.

Hier ist ein Link zur MSDN-Seite: System.ComponentModel.INotifyPropertyChanged

Das Wichtigste, das Sie beachten sollten, ist, dass Sie das PropertyChanged -Ereignis in Ihrem Eigenschaftssetzer auslösen sollten.

22
toadflakz

Fügen Sie den Bindungsmodus auf zwei Wegen hinzu, da der Bindungsmodus von Textblock standardmäßig eine Möglichkeit ist

<TextBlock HorizontalAlignment="Left" Name="StatusText" Margin="0,20" TextWrapping="Wrap" Text="{Binding StatusText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            ... Status ...
</TextBlock>

und natürlich müssen Sie INotifyPropertyChanged zu diesem Zweck implementieren. Informationen zur Implementierung finden Sie unter dieser Link .

10
Mayur Dhingra

Bei der Arbeit mit DataModels müssen Sie sicherstellen, dass das Modell beim ersten Laden vollständig ist. Wenn Sie also Folgendes tun: this.DataContext = mainViewModel und einige Teile von mainViewModel werden NICHT geladen (= null), dann können Sie sie nicht binden. Beispiel: Ich habe ein Modell in diesem Modell eines Objektprogramms. Ich binde an Text eines TextBlocks an Model.Program.Name. Das Programmobjekt ist beim ersten Laden nicht verbunden, so dass Sie nach dem Laden eines Objekts erneut binden müssen, da ansonsten keine Benachrichtigungen gesendet werden können.

3

Ihr Ansichtsmodell muss INotifyPropertyChanged implementieren, und Sie müssen es jedes Mal erhöhen, wenn sich eine Ihrer Eigenschaften ändert (dh im Setter). 

Ohne sie kann WPF nicht wissen, dass sich die Eigenschaft geändert hat.

2
GazTheDestroyer

Ich hatte dieses Problem und hier ist was ich falsch gemacht habe ...

Hinweis: Ich hatte INotifyPropertyChanged richtig codiert.


In meiner Sicht hatte ich

<SomeView.DataContext>
    <SomeViewModel/>
<SomeView.DataContext/>

... und dies ruft den Konstruktor von VM auf (Erstellen einer Instanz, auf die/die gebunden werden soll).

In einer anderen Klasse (im ViewModel-Code für das Hauptfenster meines Programms) instanziierte ich auch das ViewModel (die ViewModel), d. H .:

private SomeAstractBaseViewModel someViewModel = new SomeViewModel();
private SomeAstractBaseViewModel someOtherViewModel = new SomeOtherViewModel(); 

Sie erbten beide von einer Superklasse und ich wechselte zwischen Instanzen, die unterschiedliche Ansichten in einem Abschnitt des Hauptfensters zeigen - wie es meine Absicht war.

Wie alles verdrahtet ist, ist eine andere Frage, aber wenn ich das problematischexaml(am Anfang dieser Antwort) entferne, das zuvor eine andere "ungenutzte" Instanz des ViewModels instanziiert hat, würde die Ansicht aktualisiert gemäßINotifyPropertyChangedMechanismen.

0
JohnG79