c# - 在代码完成执行之前动态更新 WPF 窗口

标签 c# wpf mvvm

这可能是一个非常基本的问题,请耐心等待,我对 WPF/C# 的世界还是很陌生。

我有一个 WPF 应用程序,如果单击一个按钮,我会打开一个新窗口。

该窗口称为 Sync,它所做的只是实例化一个 View 模型类,其中包含一些绑定(bind)到我的 View 的公共(public)属性。

viewmodel 还实例化了一个包含大量业务逻辑的类,这更新了 ViewModel 的绑定(bind)属性,目的是更新我的窗口的内容。

这种方法有效,但只有当所有(有时相当冗长)处理完成后,窗 Eloquent 会加载,并且 View 会填充 ViewModel 属性的最后一个值。

我想我在这里遗漏了一些非常基本的东西。如何让我的窗口立即加载,然后在任何属性发生更改时更新 View ?我应该监听 PropertyChanged 事件然后更新 View 吗?我在哪里做这个?在 View 模型的 setter 中?

这里是一些简化的代码:

从主窗口的 View 模型调用我的窗口

public void SyncAction()
    {
        Sync syncWindow = new Sync();
        syncWindow.Show();
        syncWindow.Activate();
    }

window

public partial class Sync : Window
{
    public Sync()
    {
        InitializeComponent();

        var viewModel = new SyncViewModel();
    }
}

View 模型

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());
    }
}

奖励问题:我从业务逻辑中更新 View 的方式(通过传递对 View 模型的引用并从那里更新其属性)似乎有点笨拙。我绝对希望将业务逻辑分开,但不确定如何将任何输出传回 View 模型。请问这样做的更好方法是什么?

最佳答案

为什么您关心更新是否在代码执行完成之前或之后产生视觉效果?内部属性立即更新;任何查询 UI 的代码都会看到新值。

只有当您在 UI 线程上有一个长时间运行的计算时,用户才能感觉到执行期间与执行之后之间的更新之间的差异.不要那样做。

相反,与 UI 异步运行计算,以便同时处理重绘消息。您可以使用后台线程执行此操作,但使用 C# 4 及更高版本更简单的新方法是 async。因为 async 是使用 UI 线程的连续消息实现的,所以您不需要在线程之间同步数据访问或编码 UI 访问。它只是工作,而且非常好。您唯一需要做的就是将您的代码分成足够小的 block ,每个 block 都作为 async 方法实现,这样您就不会造成明显的延迟。

关于c# - 在代码完成执行之前动态更新 WPF 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20735197/

相关文章:

java - 如何将刻度从 java 转换为带有时区的 DateTime c#

c# - InitializeComponent 在绑定(bind)时触发 StackOverflow 异常

c# - 标签式浏览器 CefSharp

C#/.Net 使用 ThreadLocal 和 Async/Await

c# - Xamarin 安卓 : Cannot choose compile version

wpf - 在 DynamicResource 上使用 BasedOn 样式属性

javascript - 传入一个 observableArray 作为函数参数

wpf - 使用 InvokeCommandAction MVVM 传递参数

javascript - Vue.js $emit 和 $dispatch 有什么区别?

c# - 在 Sql 中重命名表,并相应地在 Entity Framework 中重命名表(Db First)