Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在MVVM中重新分配新模型->;不更新子集合视图模型_C#_Wpf_Mvvm_Data Binding_Model Binding - Fatal编程技术网

C# 在MVVM中重新分配新模型->;不更新子集合视图模型

C# 在MVVM中重新分配新模型->;不更新子集合视图模型,c#,wpf,mvvm,data-binding,model-binding,C#,Wpf,Mvvm,Data Binding,Model Binding,我有一个根模型~PropertyPortfolio~,我从XML文件保存/加载它。它包含属性对象的子集合 加载应用程序时,我将此对象加载到PropertyPortfolioService中。模型使用INotifyPropertyChanged,服务也使用INotifyPropertyChanged,所以我已经涵盖了这一点 我有一个子视图,它在网格中显示属性对象的子集合。装订很好 我的问题是: 当我从文件中打开新的PropertyPortfolio时,我在服务中重新分配PropertyPortfo

我有一个根模型~PropertyPortfolio~,我从XML文件保存/加载它。它包含属性对象的子集合

加载应用程序时,我将此对象加载到PropertyPortfolioService中。模型使用INotifyPropertyChanged,服务也使用INotifyPropertyChanged,所以我已经涵盖了这一点

我有一个子视图,它在网格中显示属性对象的子集合。装订很好

我的问题是:

当我从文件中打开新的PropertyPortfolio时,我在服务中重新分配PropertyPortfolio对象:

this.PropertyPortfolio = loadedPropertyPortfolio;
子视图/视图模型不会更新

我目前的解决方案是加载新公文包并重新创建子对象,如下所示:

PropertyPortfolio loadedPropertyPortfolio = /* Code to load new portfolio from XML */;

this.PropertyPortfolio.Properties.Clear();

foreach (var property in loadedPropertyPortfolio.Properties)
{
    this.PropertyPortfolio.Properties.Add(property);
}
我在寻找更好的解决办法

我希望这足以说明问题


进一步信息-问题在于PropertyViewModel(包含属性模型对象和IsSelected逻辑)

这是单个属性(集合中的每个属性)的VM:

公共类PropertyViewModel { 公共财产 { 获取{返回this.property;} }

}

这是Properties视图(包含网格)的视图模型:

公共类属性ViewModel:ViewModelBase
{
公共可观测集合财产
{
获取{返回this.propertyVMs;}
}
公共属性视图模型(PropertyPortfolio PropertyPortfolio)
{
Func viewModelCreator=model=>newpropertyviewmodel(model);
this.propertyVMs=新的ObserviewModelCollection(propertyPortfolio.Properties,viewModelCreator);
}
//其他代码(字段等)
}

能否显示关联的视图模型代码?INPC不会传播到模型层,除非您进行了设置。@BradleyDotNET我已经添加了VM代码。我知道问题是,当基础模型集合发生更改时,ViewModel集合没有被更新,我只是不知道如何处理它…PropertyPortfolio是否在其setter中引发PropertyChanged事件?您好@Andrew,是的,它触发PropertyChanged。但是当我调用这个时,它似乎破坏了绑定。PropertyPortfolio=newpropertyportfolio(/*即从文件中加载*/);我已经通过以下方式使其工作->子集合的ViewModel连接到PropertyPortfolio的PropertyChanged事件。这并不理想,因为我需要从一个文件中加载新的PropertyPortfolio并单独分配每个子集合。必须有一个更干净的方法——也许我错过了什么。
public bool IsSelected
{
    get { return this.isSelected; }
    set
    {
        SetProperty(ref this.isSelected, value, () => IsSelected);
    }
}

public PropertyViewModel(Property property)
{
    this.Property = property;
}

// Other code (fields etc)
public class PropertiesViewModel : ViewModelBase
{
    public ObservableCollection<PropertyViewModel> PropertyVMs
    {
        get { return this.propertyVMs; }
    }

    public PropertiesViewModel(PropertyPortfolio propertyPortfolio)
    {
        Func<Property, PropertyViewModel> viewModelCreator = model => new PropertyViewModel(model);
        this.propertyVMs = new ObservableViewModelCollection<PropertyViewModel, Property>(propertyPortfolio.Properties, viewModelCreator);
    }

    // Other code (fields etc)
}