gpt4 book ai didi

c# - Model 由后台线程更新,如何获取 ViewModel 的更改?

转载 作者:行者123 更新时间:2023-12-03 10:13:51 25 4
gpt4 key购买 nike

我有一个在后台自行更新的模型。目前我在模型上使用 INotifyPropertyChanged,但有人告诉我这是一个坏主意,因为模型应该独立于 UI。

当模型在 MVVM 设计模式中发生变化时,是否有更新 ViewModel 的首选模式?

最佳答案

两条评论:

  • INotifyPropertyChanged 本身并没有特定于 UI 的内容。这只是一个界面。您可以在 Model 对象上自由地实现它,这并没有错。
  • 如果 WPF 绑定(bind)到 ViewModel 上的属性 (Foo) 并且您甚至在另一个线程上触发了 PropertyChanged 事件,则 WPF 实际上会在 GUI 线程上调用该属性的 getter,因此您不必处理 Dispatcher! 警告 : 如果你这样做,请确保你的属性访问器是线程安全的。

  • 例如:
    class MyViewModel : INotifyPropertyChanged
    {
    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
    if (PropertyChanged != null)
    {
    PropertyChanged(this, new PropertyChangedEventArgs(info));
    }
    }

    public MyViewModel(MyModel mdl)
    {
    mdl.PropertyChanged +=
    new PropertyChangedEventHandler(
    mdl_PropertyChanged);
    _mdl = mdl;
    }

    private MyModel _mdl = null;

    void mdl_PropertyChanged(object sender,
    PropertyChangedEventArgs e)
    {
    if (e.PropertyName == "Foo")
    {
    this.Foo = _mdl.Foo;
    }
    }

    public int Foo
    {
    get
    {
    lock(_foo_Lock)
    {
    return _foo;
    }
    }
    set
    {
    lock(_foo_Lock)
    {
    _foo = value;
    }
    NotifyPropertyChanged("Foo");
    }
    }
    private readonly object _foo_Lock = new object();
    private int _foo = 0;
    }

    编辑 :我实际上并不建议对您的属性名称使用硬编码字符串。这是 helper class您可以使用反射在构造过程中获取属性名称。然后创建一个 AbstractViewModel基类。然后,您可以从 AbstractViewModel 继承并实现如下属性:
        #region IsCheckable
    public bool IsCheckable
    {
    get
    {
    lock(m_IsCheckable_Lock)
    {
    return m_IsCheckable;
    }
    }
    protected set
    {
    bool fire = false;
    lock(m_IsCheckable_Lock)
    {
    if (m_IsCheckable != value)
    {
    m_IsCheckable = value;
    fire = true;
    }
    }
    if(fire)
    {
    NotifyPropertyChanged(m_IsCheckableArgs);
    }
    }
    }
    private readonly object m_IsCheckable_Lock = new object();
    private bool m_IsCheckable = false;
    static readonly PropertyChangedEventArgs m_IsCheckableArgs =
    NotifyPropertyChangedHelper.CreateArgs<MyViewModel>(o =>
    o.IsCheckable);
    #endregion

    关于c# - Model 由后台线程更新,如何获取 ViewModel 的更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1899677/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com