MVVM,Catel中的数据对象“最佳实践”

时间:2013-10-23 08:25:00

标签: wpf mvvm viewmodel catel

我在我的应用程序中使用Catel。我对DataObjects和ViewModels有任何疑问 - 使用Catel efficientlu的最佳方法是什么?

情景1:

我有一个MainViewModel和一个MainView。在此视图中,我使用自己的ViewModel(SettingsViewModel)调用另一个View(DataWindow)并在对话框中显示它。在此对话框中,我插入一些SettingsValues并将其存储在xml中。最后但并非最不重要的是,我有一个DataObject类来存储Dialog中的数据。这里有任何伪代码:

MainViewModel : ViewModelBase
{
        private void OnSystemSettingsCommandExecute()
        {
            //create a new ViewModel and show as Dialog
            uiVisualizerService.ShowDialog(new SystemSettingsViewModel());
        }

    ...
}

SystemSettingsViewModel : ViewModelBase
{
        /// <summary>
        /// Gets or sets the property value.
        /// </summary>
        [Model]
        public SettingsDataObject SettingsData
        {
            get { return GetValue<SettingsDataObject>(SettingsDataProperty); }
            set { SetValue(SettingsDataProperty, value); }
        }

        /// <summary>
        ///
        /// </summary>
        public static readonly PropertyData SettingsDataProperty =   RegisterProperty("SettingsData", typeof(SettingsDataObject));


       /// <summary>
        /// It is right to define the property again here?
        /// </summary>
        [ViewModelToModel("SettingsData")]
        public string UserName
        {
            get { return GetValue<string>(UserNameProperty); }
            set { SetValue(UserNameProperty, value); }
        }

        /// <summary>
        /// Register the UserName property so it is known in the class.
        /// </summary>
        public static readonly PropertyData UserNameProperty = RegisterProperty("UserName", typeof(string));


        // Load and Save right here?
        protected override bool Save()
        {
            SettingsData.Save(@"D:\Projects\Testdata\xml\Settings.xml");

            return true;
        }

        protected override void Initialize()
        {
            SettingsData = SavableModelBase<SettingsDataObject>.Load(@"D:\Projects\Testdata\xml\Settings.xml", SerializationMode.Xml);  
        }
}


 public class SettingsDataObject : SavableModelBase<SettingsDataObject>
 {
        // Propertys 
        /// <summary>
        /// Gets or sets the property value.
        /// </summary>
        public string UserName
        {
            get { return GetValue<string>(UserNameProperty); }
            set { SetValue(UserNameProperty, value); }
        }

        /// <summary>
        /// Register the UserName property so it is known in the class.
        /// </summary>
        public static readonly PropertyData UserNameProperty = RegisterProperty("UserName", typeof(string), "MyUserName");
 }
  1. 我必须在DataClass和ViewModel类中定义属性“UserName”吗?这是我在ViewModel中定义Model属性的“常规方法”,而不是我使用[ViewModelToModel(“SettingsData”)]访问我的数据属性吗?
  2. 如何加载和保存自动数据对象?在我的情况下,我重写“保存”和“初始化”方法?在Catel有更好的方法吗?
  3. 现在我必须访问MainViewModel中的SettingsDataObject,但我没有找到在其他ViewModel中使用该对象的方法。在其他ViewModel中加载设置的“最佳实践”是什么?

1 个答案:

答案 0 :(得分:0)

问题1)

是的,这是“正确的”,但完全取决于您想要遵循的MVVM的形式。有关更多信息,请阅读this。我喜欢保护我的模型(在VM上将其设置为私有),并且只显示我真正希望在VM上公开的属性。但是其他一些人喜欢直接绑定模型。这只是您可以在文章中阅读的不同数量的解释。

问题2)

覆盖Initialize和Save正是为了这个,所以你正在以正确的方式做到这一点!

问题3)

当您需要共享模型时,您可以使用嵌套的用户控件将模型从一个视图模型传递到另一个视图模型。如果您需要在许多不同的地方访问模型,那么在ServiceLocator中注册它可能是明智的。然后它可以由Catel自动注入您的视图模型。

// Somewhere in your code
var serviceLocator = ServiceLocator.Default;
serviceLocator.RegisterType<ISettings>(mySettings);

// Your view model constructor
public MyViewModel(ISettings mySettings)
{
  // injected here
}

如果要创建自己的视图模型,可以执行以下操作:

var dependencyResolver = this.GetDependencyResolver();
var viewModelFactory = dependencyResolver.Resolve<IViewModelFactory>();
var viewModel = viewModelFactory.CreateViewModel<MyViewModel>(null);

请注意,如果您在另一个VM中,您当然可以注入IViewModelFactory,这样您只需要一行代码来创建视图模型。