0

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

场景一:

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

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 中加载设置的“最佳实践”是什么?
4

1 回答 1

0

问题1)

是的,这是“正确的”,但完全取决于您要遵循的 MVVM 形式。有关更多信息,请阅读。我喜欢保护我的模型(使其在 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 被注入,因此您只需要 1 行代码来创建视图模型。

于 2013-10-23T08:40:04.900 回答