Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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# 可观测模型中的IEnumerable_C#_Wpf_Ienumerable_Observablecollection - Fatal编程技术网

C# 可观测模型中的IEnumerable

C# 可观测模型中的IEnumerable,c#,wpf,ienumerable,observablecollection,C#,Wpf,Ienumerable,Observablecollection,我所处的情况是,我必须使用现有模型,但不允许我更改现有属性 public class Car : ModelBase { private string _model; public string Model { get { return _model; } set { this.Update(x => x.Model, () => _model= value, _model, value); } } priva

我所处的情况是,我必须使用现有模型,但不允许我更改现有属性

public class Car : ModelBase
{
    private string _model;
    public string Model
    {
        get { return _model; }
        set { this.Update(x => x.Model, () => _model= value, _model, value); }
    }

    private IEnumerable<Person> _allowedDrivers;
    public IEnumerable<Person> AllowedDrivers
    {
        get { return _allowedDrivers; }
        set { this.Update(x => x.AllowedDrivers, () => _allowedDrivers=value, _allowedDrivers, value); }
    }
}
公共级汽车:车型库
{
私有字符串模型;
公共字符串模型
{
获取{return\u model;}
设置{this.Update(x=>x.Model,()=>\u Model=value,\u Model,value);}
}
私人可数河流;
公共可数河流
{
获取{return\u;}
设置{this.Update(x=>x.AllowedDrivers,()=>\u AllowedDrivers=value,\u AllowedDrivers,value);}
}
}
现在我们最近开始实现WPF UI,我需要使用这些现有模型。我有没有办法使用IEnumerable,让它像一个可观察的集合一样工作,而不改变它?我的选择是什么

问题是我删除了AllowedRiver,然后添加了AllowedRiver,UI根本没有更新。这是合乎逻辑的,然后我(出于测试目的)将IEnumerable设置为ObservableCollection,然后UI工作。在继续使用IEnumerable但得到更新时,我还有其他选择吗

有什么方法可以让IEnumerable像一个 在不改变它的情况下观察到的收集真的吗

您可以创建另一个继承您的
汽车
类的类。由于您的
observecar
继承了
Car
类,因此您可以访问
allowedrivers
属性

因此,您可以声明所需的
observable
集合,并使用从
allowedrivers
转换的可观测集合进行初始化。此初始化应该在
get

public class ObservableCar: Car {
    public ObservableCar(){
         _observableAllowedDriver = new ObservableCollection<Person>(AllowedDrivers);
    }
    private ObservableCollection<Person> _observableAllowedDriver;
    public ObservableCollection<Person> ObservableAllowedDriver
    {
        get { return _observableAllowedDriver; }
    }
}
公共类车辆:汽车{
公共可观测{
_ObservableLowedDriver=新的ObservableCollection(AllowedDriver);
}
私有可观察收集_observeablelowdriver;
公共可观察收集可观察的LowedDriver
{
获取{return}
}
}
您只需将ObservableCollection分配给AllowedDrivers属性并对该集合进行操作:

var drivers = new ObservableCollection<Person>();
car.AllowedDrivers = drivers;

当然,上面假设您的
ModelBase.Update
方法没有做任何奇怪的事情,并最终将属性setter的
value
参数分配给其backing字段
\u
,以便属性getter返回传递给setter的集合实例


编辑:如果可能的话,将汽车类别更改为使用
ICollection
而不是
IEnumerable


谢谢大家的意见。我通过将IEnumerable制作/转换为可观察集合来解决它

像这样:

  public class Car : ModelBase
  {

    public Car()
    {
        AllowedDrivers = new ObservableCollection<Person>();
    }

    private string _model;
    public string Model
    {
        get { return _model; }
        set { this.Update(x => x.Model, () => _model= value, _model, value); }
    }

    private IEnumerable<Person> _allowedDrivers;
    public IEnumerable<Person> AllowedDrivers
    {
        get { return _allowedDrivers; }
        set { this.Update(x => x.AllowedDrivers, () => _allowedDrivers=value, _allowedDrivers, value); }
    }
}
公共级汽车:车型库
{
公共汽车
{
AllowedDrivers=新的ObservableCollection();
}
私有字符串模型;
公共字符串模型
{
获取{return\u model;}
设置{this.Update(x=>x.Model,()=>\u Model=value,\u Model,value);}
}
私人可数河流;
公共可数河流
{
获取{return\u;}
设置{this.Update(x=>x.AllowedDrivers,()=>\u AllowedDrivers=value,\u AllowedDrivers,value);}
}
}
然后在我的viewmodel中使用它,或者我这样使用它:

 var allowedDrivers = (ObservableCollection<Person>)Car.AllowedDrivers;
 allowedDrivers.Add(person)
var allowedDrivers=(ObservableCollection)Car.allowedDrivers;
AllowedRivers.Add(个人)

IEnumerable
对计数、添加和删除一无所知。理论上,这可能是一个无止境的收藏。也许您可以创建一个派生类?
公共类Car():Modelbase
<代码>()
更新了什么(…)
?是否有
Modelbase
任何类似
System.Collections.Specialized.INotifyCollectionChanged
System.ComponentModel.inotifpropertychanged
?“我是否有任何其他选项可以继续使用IENumerable但得到更新?”——以“任何其他选项”形式出现的问题总是过于广泛。当然你还有其他选择。但他们是否适用于你的情况,我们无法知道。不管怎样,您采取的任何选项都不会像使用
ObservableCollection
那样有效。请注意,只要为
allowedrivers
设置的对象实际上是一个
observeCollection
,它就应该可以工作,即使属性类型是
IEnumerable
@PeterDuniho:正如Mihai Alexandru lonut所发布的那样,这是一个非常清楚的问题,答案也非常清楚。这种“没有答案的一切,比如=2,都必须关闭”的节制很糟糕,所以如果从一开始就这样做的话,情况就不一样了。@Ignacio:“这是一个非常清楚的问题,有一个非常清楚的答案”——这个问题很清楚,但它没有一个明确的答案,它有很多。已经有两个完全不同的帖子发布了,而且不缺少其他可能的帖子。“如果从一开始就这样做,那就不一样了”——首先,所以已经不“一样了”。第二,有许多来自“早期”的问题今天是不能容忍的,这是有充分理由的。这就是为什么问问题指导原则在过去几年中发生了变化,以及如何发生变化。请注意,为了能够添加元素,只需将其转换为
ICollection
,如
((ICollection)Car.allowedrivers)。添加(person)
。将视图模型更改为包含
公共ICollection{get;set;}
,这将非常有意义。然后,您只需编写
Car.AllowedDrivers.Add(person)
car.AllowedDrivers = new ObservableCollection<Person>();
car.AllowedDrivers.Add(new Person(...)); 
  public class Car : ModelBase
  {

    public Car()
    {
        AllowedDrivers = new ObservableCollection<Person>();
    }

    private string _model;
    public string Model
    {
        get { return _model; }
        set { this.Update(x => x.Model, () => _model= value, _model, value); }
    }

    private IEnumerable<Person> _allowedDrivers;
    public IEnumerable<Person> AllowedDrivers
    {
        get { return _allowedDrivers; }
        set { this.Update(x => x.AllowedDrivers, () => _allowedDrivers=value, _allowedDrivers, value); }
    }
}
 var allowedDrivers = (ObservableCollection<Person>)Car.AllowedDrivers;
 allowedDrivers.Add(person)