【问题标题】:ObservableCollection addings itemsObservableCollection 添加项目
【发布时间】:2019-04-24 12:15:37
【问题描述】:

在我的 WPF 应用程序中,我有一个 Functions 的 Observable 集合

private ObservableCollection<Function> functions = new ObservableCollection<Function>();

我为按钮编写了一个命令,用于向集合中添加新功能: 在这种情况下,我添加了一个多项式函数。

public ICommand AddPolyFuncCommand
{
    get
    {
        return new Command(obj =>
        {
            Function newPolyFunc = new PolyFunction(this.Coefficients);
            functions.Add(newPolyFunc);
            CalculatePoints();
        });
    }
}

但是,如果我继续添加更多功能,集合中的所有最新功能都会被我要添加的功能覆盖。例如我有 3 个条目,但功能都是一样的(它们应该是不同的)。

例如,我创建了第一个函数。之后,我想向集合中添加另一个不同的功能。 它让我可以正确创建“newPolyFunc”,但如果我在运行时查看FunctionsCollection,第一个值已经被该函数覆盖。

public ICommand AddTrigoFuncCommand
    {
        get
        {
            return new Command(obj =>
            {
                this.functions.Add(newTrigoFunc);
                CalculatePoints();
            });
        }
    }

【问题讨论】:

  • 也许这只是一个错字,但你的代码应该是函数。Add(newPolyFunc)
  • 那没有解决。
  • 我认为不会,但您的代码 sn-p 在语法上不正确 - 只是指出这一点
  • 还有一些其他代码导致了问题,您需要花一些时间调试与您的收藏交互的所有部分。
  • 假设this.Coefficients 是一个ObservableCollection,你给新的Function 一个对Coefficients 的引用。您可能想要传递深层副本而不是像 ObservableCollection&lt;double&gt; newCoefficients = new ObservableCollection&lt;double&gt;(Coefficients.Select(c =&gt; c)); 这样的引用

标签: c# wpf mvvm


【解决方案1】:

通过编写Function newPolyFunc = new PolyFunction(this.Coefficients);,您传递了Coefficents 的引用,而不是一组新的系数。您可以使用 LINQ 创建系数的深层副本或创建一个空集并像这样传递它们:

//Create deep copy and pass them
ObservableCollection<double> newCoefficients = new ObservableCollection<double>(Coefficients.Select(c => c));

//Create empty set
ObservableCollection<double> newCoefficients = new ObservableCollection<double>(Enumerable.Repeat(0d, Amount/Grade));

重要提示:当您传递引用时,您传递的是指向实例/对象的指针,而不是克隆/副本。始终注意它是引用类型还是值类型。例如newTrigoFunc 是一个实例并作为引用传递。因此,this.functions 现在将相同的引用保存了 2 次,而不是保存到不同的实例/对象。当您想添加一个新对象/实例时,我建议您使用构造函数创建一个新对象/实例,如下所示

//Add new object/instance
this.functions.Add(new TrigonometricFunctionClass(parameters?));

【讨论】:

    猜你喜欢
    • 2015-07-13
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多