#c# #wpf #avalonia
Вопрос:
Я действительно не могу придумать логического решения этой проблемы. Я действительно не могу вернуть значение интерфейсу, все происходит на серверной части, и мне нужно информировать интерфейс об изменениях, чтобы правильно отображать данные.
Давайте рассмотрим этот простой базовый класс.
public class TestClass
{
public string Text {get;set;} = string.Empty;
private void SetTimer()
{
Text = "Starting count";
Timer timer = new Timer
{
Interval = 10000
};
timer.Enabled = true;
timer.Elapsed = OnTimerEvent;
}
private void OnTimerEvent(Object source, System.Timers.ElapsedEventArgs e)
{
Text = "Count finished";
}
}
Я собираюсь пропустить AXAML и просто показать модель представления.
public class NewWindowViewModel : ReactiveObject
{
private string currentText = string.Empty;
public string CurrentText
{
get => currentText;
set => this.RaiseAndSetIfChanged(ref currentText, value);
}
public TestClass TestClass { get; set; } = new TestClass();
}
Таймер запускается здесь.
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
_viewModel.TestClass.SetTimer();
}
И все в коде работает нормально, текст меняется через 10 секунд, но, очевидно, интерфейс ни о чем не имеет представления.
Перемещение логики в модель просмотра, вероятно, устранит проблему, но законно ли это в соответствии с шаблоном MVVM? Я почти уверен, что нет.
Резюме на случай, если все еще не ясно, чего я хочу — как Text
и в TestClass
изменениях, основанных на таймере, интерфейс также должен отображать этот текст ( CurrentText
).
Комментарии:
1. Вы можете передать ссылку на модель представления в модель или подписаться на событие из модели в модели представления или di в очереди или передать делегат как действие. Или вмешиваться в слабые события. Модель делает так мало, что, по-видимому, это не ваша конечная цель.