C # WPF Полученный объект из ListBox.selectedItem может изменить коллекцию itemSource, как? - PullRequest
0 голосов
/ 09 октября 2018

Я новичок в C # и WPF, поэтому, пожалуйста, не жарите меня до усердия:)

У меня есть ObservableCollection <> многих объектов, которые я показываю в ListBox с помощью

MyListBox.ItemsSource = MyObservableCollection;

Теперь цель состоит в том, чтобы изменить выбранный элемент, поэтому я делаю следующее:

MyClass selectedObject = MyListBox.SelectedItem as MyClass;

Теперь я могу просто сказать что-то вроде selectedObject.Name = "Something", и значениеselectedObject.Name изменяется.Но, к моему удивлению, значение также изменяется в моем исходном объекте ObservabalCollection («MyObservableCollection»).

Это именно то, чего я хочу, но я не понимаю, почему и как это работает.Как selectedObject подключается к исходному объекту внутри ObservableCollection?

Далее я передаю selectedObject в качестве аргумента новому окну для редактирования внутри этого нового окна:

EditObject editObject = new EditObject(selectedObject);

Evenв новом окне я могу просто присвоить новые значения selectedObject, и они также будут изменены в моей коллекции ObservableCollection.

Может кто-нибудь объяснить мне это поведение?:)

Спасибо!

1 Ответ

0 голосов
/ 09 октября 2018

MyListBox.SelectedItem является ссылкой на объект в вашей наблюдаемой коллекции.См. https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/reference-types

Если вы передадите ссылку этого объекта в другое окно и измените его там, он также должен измениться в исходной коллекции ObservableCollection.

int, например, не является ссылочным типом и будет передаваться по значению.Это не изменится в исходном местоположении.

Попробуйте этот пример:

class Program
{
    static void Main(string[] args)
    {
        TestClass testClass = new TestClass();
        Console.WriteLine(testClass.number);
        ChangeTest(testClass);
        Console.WriteLine(testClass.number);

        int i = 0;
        Console.WriteLine(i);
        ChangeInt(i);
        Console.WriteLine(i);


        Console.ReadKey();
    }

    public static void ChangeTest(TestClass t)
    {
        t.number++;
    }

    public static void ChangeInt(int i)
    {
        i++;
    }
}



public class TestClass
{
    public int number = 0;
}

Даст вам этот вывод:

0
1
0
0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...