ObservableCollection добавляет элементы - PullRequest
2 голосов
/ 24 апреля 2019

В моем приложении 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 Ответ

3 голосов
/ 24 апреля 2019

При написании 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?));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...