在我的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();
});
}
}
答案 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?));