0

认为我可能发现了一个错误或没有进行正确的建模,因为当我取消模型中的一个属性时,我的模型会发生变化。让我解释一下并提供一个简单的测试。

A 有一个带有 Running 属性的 Machine 模型。在我的 MainWindow 中,我有一个 TextBlock,它显示了一个 Machine 实例的状态。还有一个按钮可以调出简单的控制来启动和停止机器。MainWindowView 的 ViewModel 有一个用 Model 属性修饰的 CurrentMachine 属性,控制是在 StartStopView 中实现的,并通过具有 ControlledMachine 属性的 StartStopViewModel 实现(也用 Model 属性修饰)。当用户按下 MainWindow 中的按钮时,绑定到它的命令会创建 StartStopViewModel 实例并为其提供 CurrentMachine 实例,然后调用 ShowDialog。

如果用户单击 Start 或 Stop 按钮,他们分别将 Running 设置为 true 或 false 并且它按预期工作。如果用户在对话框中单击取消,则无法正常工作。然后 Running 设置为 false,尽管不是通过调用 Running 属性的 set 方法(在此处设置断点会显示这一点)。虽然在后台似乎发生的是,当按下 Cancel 时,ControlledMachine 值被分配给新创建的 Machine 实例!如果我在 Machine 构造函数中为 Running 分配一个默认值并在那里放置一个断点,我会看到这一点:

CancelTest.exe!Machine.Machine() 第 14 行 C# [Native to Managed Transition] Catel.Core.dll!Catel.IoC.TypeFactory.TryCreateToConstruct(System.Type typeToConstruct, System.Reflection.ConstructorInfo constructor, object[] parameters, bool checkConstructor, bool hasMoreConstructorsLeft) 第 552 行 + 0xd 字节 C# Catel.Core.dll!Catel.IoC.TypeFactory.CreateInstanceWithSpecifiedParameters(System.Type typeToConstruct, object[] 参数, bool autoCompleteDependencies, bool preventCircularDependencies) 第 327 行 + 0x81 字节 C# Catel.Core .dll!Catel.IoC.TypeFactory.CreateInstance(System.Type typeToConstruct) 第 129 行 + 0x12 字节 C# Catel.Core.dll!Catel.Runtime.Serialization.SerializerBase.GetContext(System.Type modelType, System.IO.Stream 流, Catel.Runtime.Serialization。SerializationContextMode contextMode) Line 264 + 0x14 bytes C# Catel.Core.dll!Catel.Runtime.Serialization.SerializerBase.DeserializeMembers(System.Type modelType, System.IO.Stream stream) Line 209 + 0x11 bytes C# Catel.Core.dll!Catel .Data.ModelBase.BackupData.RestoreBackup() 第 117 行 + 0x31 字节 C# Catel.Core.dll!Catel.Data.ModelBase.System.ComponentModel.IEditableObject.CancelEdit() 第 297 行 C# Catel.Core.dll!Catel.Data。 EditableObjectHelper.CancelEditObject(object obj) Line 77 C# Catel.MVVM.dll!Catel.MVVM.ViewModelBase.UninitializeModel(string modelProperty, object model, Catel.MVVM.ModelCleanUpMode modelCleanUpMode) Line 1224 + 0x9 bytes C# Catel.MVVM.dll!Catel .MVVM.ViewModelBase.CancelViewModel() 第 1408 行 + 0x8f 字节 C#IO.Stream 流)第 209 行 + 0x11 字节 C# Catel.Core.dll!Catel.Data.ModelBase.BackupData.RestoreBackup() 第 117 行 + 0x31 字节 C# Catel.Core.dll!Catel.Data.ModelBase.System.ComponentModel。 IEditableObject.CancelEdit() 第 297 行 C# Catel.Core.dll!Catel.Data.EditableObjectHelper.CancelEditObject(object obj) 第 77 行 C# Catel.MVVM.dll!Catel.MVVM.ViewModelBase.UninitializeModel(string modelProperty, object model, Catel. MVVM.ModelCleanUpMode modelCleanUpMode) 第 1224 行 + 0x9 字节 C# Catel.MVVM.dll!Catel.MVVM.ViewModelBase.CancelViewModel() 第 1408 行 + 0x8f 字节 C#IO.Stream 流)第 209 行 + 0x11 字节 C# Catel.Core.dll!Catel.Data.ModelBase.BackupData.RestoreBackup() 第 117 行 + 0x31 字节 C# Catel.Core.dll!Catel.Data.ModelBase.System.ComponentModel。 IEditableObject.CancelEdit() 第 297 行 C# Catel.Core.dll!Catel.Data.EditableObjectHelper.CancelEditObject(object obj) 第 77 行 C# Catel.MVVM.dll!Catel.MVVM.ViewModelBase.UninitializeModel(string modelProperty, object model, Catel. MVVM.ModelCleanUpMode modelCleanUpMode) 第 1224 行 + 0x9 字节 C# Catel.MVVM.dll!Catel.MVVM.ViewModelBase.CancelViewModel() 第 1408 行 + 0x8f 字节 C#EditableObjectHelper.CancelEditObject(object obj) Line 77 C# Catel.MVVM.dll!Catel.MVVM.ViewModelBase.UninitializeModel(string modelProperty, object model, Catel.MVVM.ModelCleanUpMode modelCleanUpMode) Line 1224 + 0x9 bytes C# Catel.MVVM.dll!Catel .MVVM.ViewModelBase.CancelViewModel() 第 1408 行 + 0x8f 字节 C#EditableObjectHelper.CancelEditObject(object obj) Line 77 C# Catel.MVVM.dll!Catel.MVVM.ViewModelBase.UninitializeModel(string modelProperty, object model, Catel.MVVM.ModelCleanUpMode modelCleanUpMode) Line 1224 + 0x9 bytes C# Catel.MVVM.dll!Catel .MVVM.ViewModelBase.CancelViewModel() 第 1408 行 + 0x8f 字节 C#

我还没有开始深入研究 Catel 代码以查看 Catel 内部实际发生的情况,但对我来说这似乎不是预期的行为,对吗?

我已经用 3.9.0 和最新的 4.0.0(unstable0456) 对此进行了测试。它的行为相同。

我没有在此处发布所有代码,而是将其放在 GitHub https://github.com/karl-petter/CatelCancelTest

4

0 回答 0