При разработке в WPF MvvM рекомендуется поощрять разделение интересов.Для этого можно реализовать модель представления со свойствами, которые затем будут привязаны к представлению.Если вы хотите, чтобы пользовательский интерфейс (представление) знал об изменениях данных, предоставляемых View Model, необходимо реализовать интерфейс INotifyPropertyChanged
, например, так:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using System.Windows.Threading;
namespace ViewModels
{
public class BaseViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public BaseViewModel()
{
//ctor
}
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
UIThread( () =>
{
//make sure the event is raised on the main thread
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
});
}
Dispatcher _dispacther;
protected void UIThread(Action action)
{
if (_dispacther == null)
{
_dispacther = Dispatcher.CurrentDispatcher;
}
_dispacther.Invoke(action);
}
}
}
Ваш класс Hello
выведетиз BaseViewModel и предоставить OnPropertyChanged ();в этом свойстве:
private string name;
public string Name
{
get { return name; }
set { name= value; OnPropertyChanged(); }
}
Теперь при изменении имени выбранного элемента в ListBox оно будет отражено в пользовательском интерфейсе.Попытайся!Эта реализация гарантирует, что событие вызывается в главном потоке, поэтому вам не нужно делать это при вызове события.Также [CallerMemberName]
заполняет имя свойства, которое вы вызываете!