gpt4 book ai didi

c# - 为什么collection1 和collection2 有相同的值?

转载 作者:行者123 更新时间:2023-12-03 11:02:30 24 4
gpt4 key购买 nike

我想要的是

所以我想检查 2 ObservableCollections如果它们彼此相等。
如果是,则返回 Nothing Changed (collection1 和 collection2 相同)。
否则返回 Something Changed .

问题

现在的问题是,即使我从集合 2 中更改项目,这两个集合也包含相同的值。

我发布了一些代码和gif调试结果向您展示我得到的结果。
我不明白,为什么单击“保存”按钮后两个集合都相同。

代码

查看型号

在我的 ViewModel 中,我有:
1 ObservableCollection调用RightsCollection .
这应该包含我的 XAML 上的权限,我可以通过 ToggleButton 进行更改.

1 Employee ObservableCollection<Groups> 所在的类位于 Groups.Col 内部有一个ObservableCollection<Rights>其中包含从无法更改的数据库加载的默认组权限。

注意:我的get set总是一样的。它们只是具有其他名称,并且 DataTypes 考虑其字段数据类型。

private Employee _singleEmployee = new Employee();
public Employee SingleEmployee
{
get => _singleEmployee;
set
{
if (_singleEmployee == value) return;
_singleEmployee = value;
OnPropertyChanged("SingleEmployee");
}
}

private ObservableCollection<Groups> _groupsCollection = new ObservableCollection<Groups>();
// public get set GroupsCollection (same like first).

private ObservableCollection<Rights> _rightsCollection = new ObservableCollection<Rights>();
// public get set RightsCollection (same like first).

员工类
public class Employee : INotifyPropertyChanged
{
private int _employeeId;
private string _firstName;
private Groups _group = new Group();

// public get set EmployeeId (Same like first).
// public get set Group (same like first).
}

权利等级
private int _rightId;
private string _rightName;
private bool _hasRight;

// Again get set is same

团体课
private int _groupId;
private string _groupName;
private ObservableCollection<Rights> _rights;

// Again, same Get/Set like always

XAML

在我的 XAML 中,我有:
一个 ComboBox . ComboBox.ItemsSource绑定(bind) GroupsCollection . ComboBox.SelectedValue绑定(bind) SingleEmployee.Group .

因此,在更改 ComboBox 时,将设置 Single Employee 的 Group。

这个 ComboBox还有一个 SelectionChanged我设置 RightsCollection 的事件等于 SingleEmployee.Group.Rights .所以现在两者都包含相同的项目/值。

它还包含一个 ItemsControl我可以自己设置权限的位置(以及 ComboBox.SelectionChanged 时将加载权限的位置(有效)。
<ComboBox x:Name="GroupComboBox" ItemsSource="{Binding GroupsCollection}" SelectedValue="{Binding SingleEmployee.Group}" DisplayMemberPath="GroupName" SelectionChanged="GroupComboBox_SelectionChanged">

项目控制
<ItemsControl ItemsSource="{Binding RightsCollection}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<DockPanel>
<ToggleButton DockPanel.Dock="Right" Margin="10" IsChecked="{Binding HasRight}"/>
<TextBlock FontSize="15" FontWeight="Bold" Text="{Binding RightName}" DockPanel.Dock="Left" Margin="10" />
</DockPanel>
<TextBlock Text="{Binding RightsDesc}" Margin="30 0 0 10" TextWrapping="Wrap"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

代码隐藏中的 SelectionChanged 事件
Debug.WriteLine("############ SelectionChanged Event ############");
Debug.WriteLine("# Before Change ##");
Debug.WriteLine($"SingleEmployee.Group.Rights.Count: {_viewModel.SingleEmployee.Group.Rights.Count} | RightsCollection.Count: {_viewModel.RightsCollection.Count}");
for (int i = 0; i < _viewModel.SingleEmployee.Group.Rights.Count; i++)
{
Debug.WriteLine($"Name: {_viewModel.SingleEmployee.Group.Rights[i].RightName}, HasRight: {_viewModel.SingleEmployee.Group.Rights[i].HasRight} || Name: {_viewModel.RightsCollection[i].RightName}, HasRight: {_viewModel.RightsCollection[i].HasRight}");
}

_viewModel.RightsCollection = _viewModel.SingleEmployee.Group.Rights;

Debug.WriteLine("# After Change #");
Debug.WriteLine($"SingleEmployee.Group.Rights.Count: {_viewModel.SingleEmployee.Group.Rights.Count} | RightsCollection.Count: {_viewModel.RightsCollection.Count}");
for (int i = 0; i < _viewModel.SingleEmployee.Group.Rights.Count; i++)
{
Debug.WriteLine$"Name: {_viewModel.SingleEmployee.Group.Rights[i].RightName}, HasRight: {_viewModel.SingleEmployee.Group.Rights[i].HasRight} || Name: {_viewModel.RightsCollection[i].RightName}, HasRight: {_viewModel.RightsCollection[i].HasRight}");
}

Debug.WriteLine("########## SelectionChanged Event END ##########");
Debug.WriteLine("################################################");

在代码隐藏中设置 ViewModel
private readonly EmployeeViewModel _viewModel;

// constructor...
{
_viewModel = (EmployeeViewModel) DataContext;
}

保存按钮命令方法
Debug.WriteLine("############## After Button Click ##############");
for (int i = 0; i < RightsCollection.Count; i++)
{
Debug.WriteLine($"Name: {SingleEmployee.Group.Rights[i].RightName}, HasRight: {SingleEmployee.Group.Rights[i].HasRight} || Name: {RightsCollection[i].RightName}, HasRight: {RightsCollection[i].HasRight}");
}
Debug.WriteLine("################################################");

bool equal = RightsCollection.Count == SingleEmployee.Group.Rights.Count && RightsCollection.All(x => SSingleEmployee.Group.Rights.Contains(x));

Debug.WriteLine(equal ? "Nothing Changed" : "Something changed");

我试过的

SelectionChanged 事件
// No Success
var collection = new ObservableCollection<Rights>(_viewModel.SingleEmployee.Group.Rights);
_viewModel.RightsCollection = collection;

.
// No Success
foreach(var item in _viewModel.SingleEmployee.Group.Rights)
_viewModel.RightsCollection.Add(item);

调试结果

选择更改结果
SelectionChangedResult (GIF) |

选择更改结果
SelectionChangedResult (Picture)

按钮点击后
After Button Click (GIF)

按钮点击后
After Button Click (Picture)

最佳答案

_viewModel.RightsCollection = _viewModel.SingleEmployee.Group.Rights;

左集合具有与右集合相同的引用。
因此,如果您更改一个集合,它将反射(reflect)在另一个集合中。
ObservableCollection<Whatever> _viewModel.RightsCollection = new ObservableCollection<Whatever>();

foreach(var item in _viewModel.SingleEmployee.Group.Rights)
_viewModel.RightsCollection.Add(item);

关于c# - 为什么collection1 和collection2 有相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51100453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com