我是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中更改。
有人可以向我解释这种行为吗? :)
谢谢!
答案 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