ModelAttribute未正确取消

时间:2014-08-27 07:45:07

标签: catel

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

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

如果用户单击“开始”或“停止”按钮,则会将“运行”分别设置为“true”或“false”,并且按预期工作。如果用户在对话框中单击“取消”,则无法正常工作。然后将Running设置为false,但不是通过调用Running属性的set方法(在那里设置断点显示)。虽然在后台看起来似乎是在按下取消时,ControlledMachine值被分配给新创建的Machine实例!如果我在Machine构造函数中为Running分配一个默认值并在那里放置一个断点,我会看到这个:

  

CancelTest.exe!Machine.Machine()第14行C#   [原生到管理过渡]   Catel.Core.dll!Catel.IoC.TypeFactory.TryCreateToConstruct(System.Type typeToConstruct,System.Reflection.ConstructorInfo构造函数,object []参数,bool checkConstructor,bool hasMoreConstructorsLeft)行552 + 0xd字节C#   Catel.Core.dll!Catel.IoC.TypeFactory.CreateInstanceWithSpecifiedParameters(System.Type typeToConstruct,object [] parameters,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 stream,Catel.Runtime.Serialization.SerializationContextMode contextMode)第264行+ 0x14字节C#   Catel.Core.dll!Catel.Runtime.Serialization.SerializerBase.DeserializeMembers(System.Type modelType,System.IO.Stream 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)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

0 个答案:

没有答案