1

コードの動作に少し混乱しています。私はまだMVVMライトの初心者です。

コマンドで表示される NewMessageWindow があります

    private ICommand newMessageCommand;
    public ICommand NewMessageCommand
    {
        get
        {
            if (newMessageCommand == null)
                newMessageCommand = new RelayCommand(() =>
                {
                    new NewMessageWindow().Show();
                });
            return newMessageCommand;
        }
    }

複数の NewMessageWindows が存在する可能性があり、それぞれに個別の ViewModel が必要です。しかし、複数のウィンドウを開いたときに気付きました。それらのウィンドウで何かを変更すると、すべてのウィンドウに影響します。たとえば、コンボボックスを変更すると、すべてのウィンドウでコンボボックスの値が変更されます。

それを避ける方法は?互いに影響を与えない別々のビューモデルで複数のウィンドウを開くにはどうすればよいですか?

変化するオブジェクトは、ビューにバインドされたObservableCollectionsです。

編集:

これはViewLocatorがどのように見えるかです

    public NewMessageWindowModel NewMessage
    {
        get
        {
            return ServiceLocator.Current.GetInstance<NewMessageWindowModel>();
        }
    }

そしてコンストラクターで

    SimpleIoc.Default.Register<NewMessageWindowModel>();

バインディングは次のようになります。

 DataContext="{Binding NewMessage,
                          Source={StaticResource Locator}}"

問題を修正しました

 ServiceLocator.Current.GetInstance<NewMessageWindowModel(System.Guid.NewGuid().ToString());

しかし、古いインスタンスがキャッシュされていることを読みました。それらを取り除く方法は?

4

2 に答える 2

0

この動作は Servicelocator によるものです。オブジェクトの同じインスタンスを返します。共有インスタンス全体で変更を取得します。ViewModel の別のコピーが必要な場合。GetNewInstance を Service ロケータに実装できます。

于 2013-07-08T13:12:44.007 に答える