对象引用更新,更新所有集合属性?

时间:2017-11-01 10:39:03

标签: c# wpf linq

简介

我发现了一个非常奇怪的情况,基本上我有一个名为Matches的集合属性和一个名为Match的对象属性。 Matches个集合包含Match项的列表,如下所示:

private ObservableCollection<Match> _matches = new ObservableCollection<Match>(); 
public ObservableCollection<Match> Matches
{
    get { return _matches; }
}

当应用程序启动时,该集合将被保存,实际上,软件从Internet站点获取一些数据,然后使用刮刀使用对应的对象模型Match填充集合。

错误开始的地方

Matches集合绑定到DataGrid。当用户点击Match上提供的元素(DataGrid)时,代码会触发事件SelectionChanged,在此事件中我创建了Match点击的副本,所以我可以在我的所有应用程序中使用此对象:

var match = controller.Matches.FirstOrDefault(c => c.MatchLink == ((Match)Matches.SelectedItem).MatchLink);

正如您使用Linq所看到的,我会检查用户点击的Match是否与Match集合中包含的Matches具有相同的链接事实上,集合中的每个Match都有一个唯一的链接,例如GUID

错误

Match对象如下所示:

 private Match _match;
 public Match Match
 {
    get { return _match; }
    set
    {
        _match = value;
        OnPropertyChanged();
    }
 }

正如我所说,它包含用户点击的Match。此对象允许我从我的应用程序内的所有方法仅从此Match获取来自Internet的数据。这工作得很好。到现在为止。

我的应用程序允许用户应用一些过滤器,实际上是用户按下按钮,然后使用用户填写的属性更新保存的Match,例如:

Match.League.Rounds = availableRounds;

此代码会导致错误,但我稍后会尝试更好地解释错误,我需要解释一下这里发生的事情。 基本上,应用程序中保存的当前Match应仅更新自己的属性League.Rounds,此属性是Rounds的{​​{1}}列表,结构非常简单:

Match

更新工作正常但行public class Round { public int Id { get; set; } public string Name { get; set; } } 也更新了对象集合Match.League.Rounds = availableRounds;中可用的所有属性League.Rounds

我不明白为什么会发生这种情况,我还没有创建点击对象的引用:

Matches

实践内容的实例

在应用过滤器之前

var match = controller.Matches.FirstOrDefault(c => c.MatchLink == ((Match)Matches.SelectedItem).MatchLink);

应用过滤器后

Matches Collection
   Match.Leagues.Rounds[0] contains Id 10 and Name foo

但不应修改,只应修改Matches Collection Match.Leagues.Rounds[0] contains Id 11 and Name foofoo

但是一个新对象。有人可以解释如何解决这个问题吗?最好的问候。

1 个答案:

答案 0 :(得分:1)

  

我没有创建点击对象的引用

是的,你有。这创建一个新的Match对象:

var match = controller.Matches.FirstOrDefault(c => c.MatchLink == ((Match)Matches.SelectedItem).MatchLink);

它引用了Match集合中现有的Matches对象。

如果要创建新对象,则应使用new运算符:

var existing = controller.Matches.FirstOrDefault(c => c.MatchLink == ((Match)Matches.SelectedItem).MatchLink);
Match match = new Match();
//set all properties of the new object...
match.Prop1 = existing.Prop1;

另请注意,您还需要创建新的Round个对象。您应该考虑实施IClonable接口。

FirstOrDefault()方法不会为您克隆对象。