【发布时间】:2014-09-12 21:12:08
【问题描述】:
这可能是一个非常基本的问题,请多多包涵,我对 WPF/C# 的世界还是很陌生。
我有一个 WPF 应用程序,如果单击按钮,我会在其中打开一个新窗口。
该窗口称为 Sync,它所做的只是实例化一个 viewmodel 类,其中包含一些绑定到我的视图的公共属性。
viewmodel 还实例化了一个包含大量业务逻辑的类,这会更新 ViewModel 的绑定属性,目的是更新我的窗口的内容。
这种方法有效,但只有在所有(有时相当长的)处理完成后,窗口才会加载,并且视图会填充 ViewModel 属性的最后一个值。
我想我在这里遗漏了一些非常基本的东西。如何让我的窗口立即加载,然后在任何属性发生更改时更新视图?我应该监听 PropertyChanged 事件然后更新视图吗?我在哪里做这个?在视图模型的设置器中?
下面是一些简化的代码:
从我的主窗口的视图模型调用我的窗口
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;
}
}
}
一些业务逻辑
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());
}
}
额外问题:我从业务逻辑中更新视图的方式(通过传入对视图模型的引用并从那里更新其属性)似乎有点笨拙。我绝对希望将业务逻辑分开,但不确定如何将任何输出传递回视图模型。请问有什么更好的方法吗?
【问题讨论】: