gpt4 book ai didi

c# - MVVM OnPropertyChanged 在使用赋值运算符时不改变 View (PropertyChanged 变为空)

转载 作者:行者123 更新时间:2023-12-03 10:44:56 24 4
gpt4 key购买 nike

我正在尝试创建一个撤消/重做系统。当前,当用户执行某项操作时,原始对象和新对象将按“操作”复制到列表中。如果我按下撤消按钮,我想再次将原始值分配给新值。

我已经能够在列表中同时获得新对象和原始对象,但是使用我所做的撤消再次分配旧对象时出错了。它会在包含所有可以更改的对象的主列表中更新,但不会在 View 中更新。

undo方法是这样的:

for (int t = 0; t < mainData.GroupModelList.Count; ++t)
{
if (mainData.GroupModelList[t].Name == commandList.ElementAt(position).groupModelNew.Name)
{
mainData.GroupModelList[t] = new ViewModels.GroupViewModel(commandList.ElementAt(position).groupModelOrig);
break;
}
}

这会调用 GroupViewModel 的构造函数:
public GroupViewModel(GroupViewModel selectedGroup)
{
groupModel = new GroupModel();

// values are assigned from the selectedGroup here (which is the original object in the UndoRedo part)
// ...

OnPropertyChanged(null);
}

这是 OnPropertyChanged 方法:
private void OnPropertyChanged(string Property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(Property));
}
}

我在某处读到在 PropertyChangedEventArgs 使用“null”使一切更新,所以这就是我尝试过的,但它不起作用。
在更多断点之后,我注意到 PropertyChanged调用新构造函数时为 null,这可能是问题所在。不过,它确实可以在没有撤消/重做的情况下工作。 (当简单地改变对象使用文本框或类似的值时)

我还读到我应该将 DataContext 指向对象本身,但这似乎是不可能的,因为该对象没有 DataContext 属性。

编辑:人们告诉我应该使用 ObservableCollection。我已经在使用它了。像这样:(这是 View 可以访问的列表)
private ObservableCollection<GroupViewModel> groupModelList = new ObservableCollection<GroupViewModel>();
public ObservableCollection<GroupViewModel> GroupModelList
{
get { return groupModelList; }
}

编辑:这是绑定(bind)到 View 的方式:
首先是 XAML 中的绑定(bind)
<Window.Resources>
<vm:MainViewModel x:Key="MainViewModel" />
</Window.Resources>
MainViewModel持有 MainData 类型的对象在那个类里面有一个 ObservableCollection<GroupViewModel> .
例如,这是将列表中选定项目的名称绑定(bind)到 View 中的文本框的代码:(第一行是显示 GroupViewModel 列表中所有项目的列表框,第二行是我想给出的文本框一个例子)
<ListBox DisplayMemberPath="Name" Height="412" HorizontalAlignment="Left" ItemsSource="{Binding Source={StaticResource MainViewModel}, Path=mainData.FilteredGroupModelList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="10,44,0,0" Name="lbFoundItems" SelectedItem="{Binding Source={StaticResource MainViewModel}, Path=SelectedGroup, Mode=OneWayToSource}" VerticalAlignment="Top" Width="250" SelectionMode="Single" />

<ComboBox Height="23" HorizontalAlignment="Left" ItemsSource="{Binding ElementName=lbFoundItems, Path=SelectedItem.Types, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Margin="436,378,0,0" Name="cmbTypes" SelectedItem="{Binding Source={StaticResource MainViewModel}, Path=SelectedType, Mode=OneWayToSource}" VerticalAlignment="Top" Width="180" />

这也是 SelectedGroup保存对 ListBox 中选定项的引用的变量:
private GroupViewModel selectedGroup;
public GroupViewModel SelectedGroup
{
get { return selectedGroup; }
set
{
selectedGroup = value;
OnPropertyChanged("SelectedGroup");
}
}

最佳答案

这里应该更新的“一切”是什么?想一想,这并不神奇:绑定(bind)到对象实例的 UI 元素订阅了 PropertyChanged ,这就是为什么它们在触发时会更新。

更新:
我不认为我可以在这里获得完整的图片,不清楚您要更新什么以及您正在使用哪些类。您的示例包含 for , ifbreak ,但没有 XAML!这在讨论 WPF 机制时真的很重要吗?.. 我如何确定该错误不存在? 分解任务。 毫无悔意地分解它。创建一个小型项目,收集项目并仅使用 wpf,无论您的业务如何。当您这样做时,您将有 70% 的机会自己找到根本原因,20% 的机会通过 google 成功,并且提出问题将帮助您解决剩下的 10% 的案例。

关于c# - MVVM OnPropertyChanged 在使用赋值运算符时不改变 View (PropertyChanged 变为空),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30501048/

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