2015-12-28 4 views
-1

У меня есть два вида и один viewModel как dataContext. после запуска приложения он запускает два экземпляра viewModels. проблема заключается в том, как создать только один экземпляр. Я использую mvvm light. и извините за мой английский :)C# wpf mvvm light несколько представлений один экземпляр вида модели

+0

Можете ли вы просто сделать модель View Singleton? –

+0

Что значит? Я слышал об этом шаблоне, но никогда не использовал их. и не возражаете, как реализовать это на viewModel :) – bmo

+0

Мне нужно поделиться некоторыми командами и привязкой между представлениями – bmo

ответ

0

Не используйте DataContext вместо использования StaticResource!

Попробуйте это:

Для первого взгляда

<FirstView.Resources> 
 
    <local:CommonViewModel x:Key="commonVM"/> 
 
</FirstView.Resources>

Сделайте то же самое для второго вида. Теперь, когда вы что-то обязательным, говоря ключ в виде StaticResource как:

<TextBlock Text={Binding someTextProp,Source={StaticResource commonVM}}/>

Это должно работать

+0

Я попытался, но он создает те же две модели view .. – bmo

+0

Вы внедрили * INotifyPropertyChanged * в свой ViewModel? –

+0

нет, я использую mvvm light с его ViewModelBase – bmo

0

Итак, если я понимаю, что вы говорите.
Вы получаете два экземпляра вашей модели View-Model, но на самом деле вам нужен только один экземпляр вашей модели View, который может быть разделен между двумя представлениями.

Регистрация вашего View-модель в ViewModelLocator Класс:

public class ViewModelLocator 
{ 
    static ViewModelLocator() 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

     if (ViewModelBase.IsInDesignModeStatic) 
     { 
      SimpleIoc.Default.Register<Model.IDataService, Data>(); 
     } 
     else 
     { 
      SimpleIoc.Default.Register<Model.IDataService, Model.DataService>(); 
     } 

     SimpleIoc.Default.Register<MainViewModel>(); 

    } 

    /// <summary> 
    /// Gets the Main property. 
    /// </summary> 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", 
     "CA1822:MarkMembersAsStatic", 
     Justification = "This non-static member is needed for data binding purposes.")] 
    public MainViewModel Main => ServiceLocator.Current.GetInstance<MainViewModel>(); 


    /// <summary> 
    /// Cleans up all the resources. 
    /// </summary> 
    public static void Cleanup() 
    { 
    } 
} 

Затем убедитесь, чтобы получить DataContext для обоих Взгляды из названия (он должен быть создан, если вы сделали новый проект MVVM Light). вы представили свою модель View в классе ViewModelLocator, в моем примере она установлена ​​как Main. Вы можете сделать это, используя ViewModelLocator как статический ресурс на ваш взгляд в XAML коде - как это:

<Window x:Class="mvvmLight.View.YourView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    DataContext="{Binding Main, Source={StaticResource Locator}}"> 

Было бы хорошо, чтобы увидеть некоторые из кода, что бы сделать его легче найти проблему.
Вставьте привязку DataContext как к вашим представлениям, так и к View-Model и ViewModelLocator (если у вас есть).

+0

благодарим за ответ! и счастливый новый год :) Я отвечу позже – bmo

Смежные вопросы