Связывание 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
}
Но его все еще не работает
Ответы
Ответ 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 не подключается при начальной загрузке, поэтому вам придется переустановить объект, загруженный после этого, потому что в противном случае никакие уведомления не могут быть отправлены.