Это, наверное, действительно основной вопрос, пожалуйста, несите меня, я все еще очень новичок в мире WPF/C#.Динамическое обновление окна WPF до того, как код завершит выполнение
У меня есть приложение WPF, где я открываю новое окно, если нажата кнопка.
Окно называется Sync, и все, что он делает, создает экземпляр класса viewmodel, который содержит некоторые общедоступные свойства, привязанные к моему представлению.
Viewmodel также создает класс, содержащий много бизнес-логики, это обновляет связанные свойства ViewModel, целью которого является обновление содержимого моего окна.
Этот вид работ, но только после завершения всей (иногда довольно длительной) обработки загружается окно, а вид заполняется последним значением свойств ViewModel.
Я думаю, что мне не хватает чего-то довольно элементарного здесь. Как получить мое окно для мгновенной загрузки, а затем обновить представление, если какое-либо из свойств изменилось? Должен ли я прослушивать событие PropertyChanged, а затем обновлять представление? Где я это делаю? Внутри сеттера представления модели?
Вот несколько упрощенный код:
Вызов мое окно из моего главного окна View Model
public void SyncAction()
{
Sync syncWindow = new Sync();
syncWindow.Show();
syncWindow.Activate();
}
Окно
public partial class Sync : Window
{
public Sync()
{
InitializeComponent();
var viewModel = new SyncViewModel();
}
}
вида модели
class SyncViewModel
{
private string _miscStatus = "";
public SyncViewModel()
{
var sync = new SyncLogic();
sync.SyncAll(this);
}
public string MiscStatus
{
get
{
return _miscStatus;
}
set
{
_miscStatus += value;
}
}
}
Некоторые Бусин ESS логика
class SyncLogic
{
private ViewModel.SyncViewModel _syncViewModel;
public void SyncAll(ViewModel.SyncViewModel syncViewModel)
{
_syncViewModel = syncViewModel;
// lock our synctime
var syncTime = DateTools.getNow();
_syncViewModel.MiscStatus = "Sync starting at " + syncTime.ToString();
// Do lots of other stuff
_syncViewModel.MiscStatus = String.Format("Sync finished at at {0}, total time taken {1}",
DateTools.getNow().ToString(), (DateTools.getNow() - syncTime).ToString());
}
}
Бонус вопрос: Как я буду обновлять вид изнутри моей бизнес-логики (передав ссылку на ViewModel и обновляет свои свойства оттуда) кажется немного запутано. Я определенно хочу, чтобы бизнес-логика была отдельной, но я не уверен, как я могу передать любой выход обратно в viewmodel. Какой был бы лучший способ сделать это, пожалуйста?
Все ответы на мой вопрос были очень полезными и позволили мне увеличить мое понимание, однако это дало мне самое большое начало, и теперь я успешно реализовал нечто похожее, которое: а) работает так, как я предполагал, и б) гораздо более ремонтопригодным. Спасибо @jure –