0

アプリケーションで Catel を使用しています。DataObjects と ViewModels について質問があります - Catel の効率的な使用方法は何ですか?

シナリオ 1:

MainViewModel と MainView があります。このビューでは、独自のビューモデル (SettingsViewModel) を持つ別のビュー (データウィンドウ) を呼び出し、それをダイアログに表示します。このダイアログで、いくつかの SettingsValues を挿入し、それを xml に保存します。最後になりましたが、Dialog からのデータを格納するための 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 に答える