ObservableCollection添加项

时间:2019-04-24 12:15:38

标签: c# wpf mvvm

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

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();
            });
        }
    }

1 个答案:

答案 0 :(得分:3)

通过编写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?));