简介
我发现了一个非常奇怪的情况,基本上我有一个名为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
。
但是一个新对象。有人可以解释如何解决这个问题吗?最好的问候。
答案 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()
方法不会为您克隆对象。