从自己的后台线程更新绑定控件

3

我有一个WPF应用程序,采用MVVM架构。ViewModel和View连接在一起。View中的控件绑定到ViewModel中,并且ViewModel实现了INotifyChanged接口。ViewModel中简单的控件更新运作正常。

我想要创建一个信息类(Info class),其中包含一些信息字段。接下来,我想要创建自己的线程,将Info类中的字段映射到ViewModel中的字段,从而更新View。Info类的对象将被用作在ViewModel中调用函数的参数。

private int someControl;
public SomeControl {
    get{return someControl;}
    set 
    {
        someControl = value;
        OnPropChanged("SomeControl");
    }

private InfoClass info = new InfoClass();
Thread thread = null;

public ViewModel()
{
    Thread thread = new Thread(new ThreadStart(update));
    thread.IsBackground = true;
    thread.start();

    someLongFunction(info);
}

private void update()
{
    SomeControl = info.someField;
    thread.sleep(1000);
    update();
}

我该添加或更改什么来定期获得更新?现在,只有当一些长时间运行的函数结束其工作时才会进行更新。


我不完全明白你的意思... 你想做什么?你想定期更新你的视图吗? - bash.d
在那里递归调用您的更新方法最终会创建一个堆栈溢出!好吧,您可以在System.Threading.Timer中定义计时器,或者您将不得不使用线程同步原语(MutexEvent)进行工作。而这是在运行someLongFunction时发生的吗? - bash.d
我没有理解stackoverflow,但可能是因为我的应用运行时间太短了。我必须补充说明的是,如果我写SomeControl += 1而不是SomeControl = info.someField;,它可以正常工作。 - Dakorn
我将尝试使用计时器来完成它。我也想知道为什么 SomeControl += 1 可以正常工作,而不是 SomeeControlee = info.somerfield。你对此了解吗? - Dakorn
这是因为你给你的对象分配了一个新的引用,这样并不会调用getter/setter方法! - bash.d
显示剩余2条评论
1个回答

0

如果您实际想要的是连续的视图更新,那么您不必为此创建线程,因为这样您将不得不在 Dispatcher 线程(UI 线程)上进行这些更新。相反,您可以使用 DispatcherTimer 类,该类专门针对这种情况构建,您可以提供一个时间间隔,DispatcherTimer 将在该间隔期间定期调用您的方法,并会自动在 Dispatcher 线程上执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接