仅查看Model OnPropertyChanged上的更新,但不查看ViewModel OnPropertyChanged中的更新

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仅查看Model OnPropertyChanged上的更新,但不查看ViewModel OnPropertyChanged中的更新相关的知识,希望对你有一定的参考价值。

我有一个ViewModel托管Model类的属性,其中ViewModel和Model都实现了INotifyPropertyChanged

但是,如果模型中的属性已更改,则View仅更新。如果在ViewModel中更改了属性,则不会更新视图。

型号基础:

public class BaseModel : INotifyPropertyChanged
{
    private int id;

    public int Id
    {
        get { return id; }
        set { id = value; OnPropertyChanged(new PropertyChangedEventArgs("Id")); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(PropertyChangedEventArgs propertyChangedEventArgs)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyChangedEventArgs.PropertyName));
    }
}

模型(添加和删除Positionen-Collection显示在视图中):

public class ChildModel : BaseModel 
{

    private ObservableCollection<SubModel> positionen;

    public ObservableCollection<SubModel> Positionen
    {
        get { return positionen; }
        set { positionen = value; OnPropertyChanged(new PropertyChangedEventArgs("Positionen")); }
    }
}

ViewModel基础:

public abstract class BaseViewModel<T> where T : BaseModel , INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;


    protected void OnPropertyChanged(PropertyChangedEventArgs propertyChangedEventArgs)
    {
        PropertyChanged?.Invoke(this, propertyChangedEventArgs);
    }


    public abstract ObservableCollection<T> DatensatzListe { get; set; }

    public abstract T AktuellerDatensatz { get; set; }

}

ViewModel子项(此处属性的更新未显示在视图中):

public class ChildViewModel : BaseViewModel<ChildModel >
{
    public override ObservableCollection<ChildModel > DatensatzListe
    {
        get { return DatensatzListe; }
        set { DatensatzListe = value; }
    }

    private ChildModel aktuellerDatensatz;

    public override ChildModel AktuellerDatensatz
    {
        get { return aktuellerDatensatz; }
        set { aktuellerDatensatz = value; OnPropertyChanged(new PropertyChangedEventArgs("AktuellerDatensatz")); }
    }

    private string tesxt;

    public string Tesxt
    {
        get { return tesxt; }
        set { tesxt = value; OnPropertyChanged(new PropertyChangedEventArgs("Tesxt")); }
    }
}

如果我更新后面的代码中的文本属性,更新不会显示在视图中。我更新Aktueller Datensatz.Is,变化显示得很好。

我怎样才能解决这个问题。如果需要更多代码,请告诉我。

答案

根据以下定义,

public abstract class BaseViewModel<T> where T : BaseModel , INotifyPropertyChanged

BaseViewModel不是来自INotifyPropertyChanged所以观点不知道它的变化。

在上面的代码中,INotifyPropertyChanged是对T的约束,其中T必须来自BaseModelINotifyPropertyChanged

更新到

public abstract class BaseViewModel<T>: INotifyPropertyChanged 
    where T : BaseModel

因为BaseModel已经来自INotifyPropertyChanged

以上是关于仅查看Model OnPropertyChanged上的更新,但不查看ViewModel OnPropertyChanged中的更新的主要内容,如果未能解决你的问题,请参考以下文章

实时监听输入框值变化的完美方案:oninput & onpropertychange

oninputonchange与onpropertychange事件的区别

使用 onpropertychange 和 oninput 检测 inputtextarea输入改变

实时监听输入框值变化:oninput & onpropertychange

实时监听输入框值变化的完美方案:oninput & onpropertychange

js/jquery 实时监听输入框值变化的完美方案:oninput & onpropertychange