C#WPF从ListBox.selectedItem接收到的对象能够修改itemSource集合,怎么办?

时间:2018-10-09 12:59:23

标签: c# wpf xaml

我是C#和WPF的新手,所以请不要为我烦恼:)

我有许多对象的ObservableCollection <>,这些对象通过使用显示在列表框中

MyListBox.ItemsSource = MyObservableCollection;

现在的目标是更改选定的项目,所以我正在做以下事情:

MyClass selectedObject = MyListBox.SelectedItem as MyClass;

现在,我只能说类似selectedObject.Name = "Something"之类的内容,原因是selectedObject.Name的值已更改。但令我惊讶的是,我的原始ObservabalCollection对象(“ MyObservableCollection”)中的值也更改了。

这正是我想要的,但是我不明白为什么以及它如何工作。 selectedObject如何连接到ObservableCollection内部的原始对象?

进一步在im上将selectedObject作为参数传递给新窗口,以便在新窗口中进行编辑:

EditObject editObject = new EditObject(selectedObject);

即使在新窗口中,我也可以将新值分配给selectedObject,它们也将在我的ObservableCollection中更改。

有人可以向我解释这种行为吗? :)

谢谢!

1 个答案:

答案 0 :(得分:0)

MyListBox.SelectedItem是可观察集合中对象的引用。参见https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/reference-types

如果将此对象的 reference 传递到另一个窗口并在那里进行修改,则它也应在原始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