Подтвердить что ты не робот

Связывание WPF не обновляет вид

У меня есть текстовый блок:

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

отделенного кода:

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

и in viewModel:

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

и в функции in viewModel:

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

GetStatusText() возвращает строку, например "Выполненная работа" и т.д. Значения этих функций воспринимаются this.StatusText, но свойство TextBlock text не изменяется и показывается все еще местозаполнитель "... Status..."

Я знаю такие вопросы → CLICK < --- но после прочтения этого я все еще не могу найти решение

@Update

После ваших предложений я обновил свой код, и теперь у меня есть это:

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

и объявление viewModel:

 public class StatusPageViewModel : ObservableObject, INavigable

где:

Класс ObservableObject:

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 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
}

Но его все еще не работает

4b9b3361

Ответ 1

Вам нужно реализовать INotifyPropertyChanged в вашем представлении ViewModel, чтобы уведомить View, что свойство изменилось.

Здесь ссылка на страницу MSDN для него: System.ComponentModel.INotifyPropertyChanged

Самое главное отметить, что вы должны поднять событие PropertyChanged в свой установщик свойств.

Ответ 2

Добавить режим привязки в двух направлениях, потому что по умолчанию режим привязки Textblock является одним из способов

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

а также, конечно, вам нужно реализовать INotifyPropertyChanged для этой цели, обратитесь к этой ссылке, чтобы узнать, как реализовать.

Ответ 3

Ваша модель представления должна реализовать INotifyPropertyChanged, и вам нужно поднять ее каждый раз при изменении одного из ваших свойств (то есть в сеттере).

Без этого WPF не знает, что свойство изменилось.

Ответ 4

При работе с DataModels вы должны быть уверены, что модель завершена при начальной загрузке. Поэтому, если вы это сделаете: this.DataContext = mainViewModel и некоторые части вас mainViewModel НЕ загружаются (= null), тогда вы не можете их связывать. Например, у меня есть модель внутри этой модели объекта. Я привязываю текст TextBlock к Model.Program.Name. Объект Program не подключается при начальной загрузке, поэтому вам придется переустановить объект, загруженный после этого, потому что в противном случае никакие уведомления не могут быть отправлены.