【问题标题】:How to create a binded copy of an object in c#?如何在 C# 中创建对象的绑定副本?
【发布时间】:2021-06-15 09:54:56
【问题描述】:

我有一个 Employee 类的对象(让我们称之为 Alice),并且想要创建这个对象的副本(让我们称之为 Alice_again),这样如果我改变 Alice,Alice_again 的属性也会改变。基本上是创建一个对象的副本,其属性绑定到原始对象。

编辑

我有两个不同的 ObservableCollection 的 Employee(Employee 是用户控件)并且都包含相同的对象 Employee,我想显示每个 ObservableCollection 一次。为此,我正在使用 ItemsControl 并将 ItemsControl 的 ItemsSource 绑定到这些 ObservableCollection 并且正如我在此 link 上阅读的那样,给定的对象可能只出现在给定的逻辑树中一次,所以我正在尝试创建对象,但我不想在有更新时更新两个副本。

【问题讨论】:

  • 如果所有属性都相同,那么为什么要复制?为什么不能使用一个副本?目标尚不明确——很难提出最佳解决方案。
  • 在这种情况下听起来好像不是副本,只是原始参考?
  • 我有 2 个不同的 ObservableCollection 员工,我想显示每个列表。为此,我正在使用 ItemsControl,并且正如我在 this 链接上所读到的,给定的对象可能只出现在给定的逻辑树中一次。 @EldHasp
  • 请展示用例(您可以edit提问以添加缺失的细节)。我猜你只需要传递 Alice 的引用。
  • 两个列表可能包含对同一个对象的引用。 ItemsSource 集合中的元素不应是视觉对象。

标签: c# wpf xaml data-binding


【解决方案1】:

您不需要创建副本。

由于 ItemsSource 集合中的元素不应该是视觉对象,因此两个或多个源集合可能包含对相同对象的引用。

因此,两个 ItemsControl 的 ItemTemplate 中的两个不同 UI 元素将合法地绑定到同一个数据项对象。

【讨论】:

  • 我刚刚对其进行了测试,它确实有效。非常感谢您的帮助!
  • @AdityaJain 这并不重要。你应该接受对你最有帮助的答案。如果两个答案同样有用,请接受“更好”的答案,无论这意味着什么:-)
【解决方案2】:

对象只能在给定的逻辑树中出现一次

逻辑树是 UI 元素的树。此树中不包含不同类型的元素。
对于源集合中的每个项目,都会创建自己的 ContentPresenter,并将其包含在父 ItemsControl 的逻辑树中。
每个 ItemsControl 从 ContentPresenter 创建自己的集合。
因此,不同的 ContentPresenters 将在不同的 ItemsControls 中为同一个源项创建,这不会产生任何问题。
您甚至可以在同一个集合中多次包含同一个项目。 并且对于这个元素的每个位置,都会创建它自己的 ContentPresenter。

dataTemplate 有按钮,其内容绑定到 Employee 的属性

实际上,数据模板是创建 UI 元素的工厂。 并且在为每个元素应用模板时,将创建自己独特的 UI 元素。

【讨论】:

  • 哦,好吧,那么也会为重复输入创建自己独特的 UI 元素吗?我的意思是如果相同的对象被添加两次,那么唯一的 UI 元素将被创建两次或一次? @EldHasp
  • 两次。尝试指定一个简单的集合 int [] {1,1,1,1}。每个 1 将在自己的行中,这不会产生任何问题
  • 哦,好的,知道了!非常感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 2011-06-15
  • 2010-09-16
相关资源
最近更新 更多