2013-05-12 2 views
5

Я хочу, чтобы в главной модели просмотра был определенный список, а затем доступ ко многим другим режимам просмотра.Доступ к объекту в одной ViewModel от другого

Например, в MainViewModel.cs У меня будет список из 50 номеров, , а затем в NumListViewModel.cs, я хотел бы получить к нему доступ, чтобы показать его как список, и в AddNumViewModel.cs. d хотел бы иметь возможность обновить этот список.

Было высказано предположение, что я использую event/evenaggerator, что я и делал, но, к сожалению, для всего, что я знаю, все, что я могу с ним сделать, это отправить число из одного представления в другое и сообщить ему обновить список, но проблема заключается в том, что по мере того, как программа растет, мне нужно будет иметь много подписчиков в основной модели представления, а когда что-то действительно произойдет, мне придется «публиковать» события в соответствии с количеством подписчиков, что еще более затрудняет его поддержку.

Я также нашел еще один ответ, в котором предписывается создать экземпляр anotherVM внутри mainVM с параметром, установленным на «this», который является ссылкой на mainVM. Это работает, но опять же, это может стать довольно длинным.

Так что мой вопрос в том, есть ли лучше способ доступа к собственности с другой виртуальной машины?
Как буквально есть экземпляр класса, который содержит список в mainVM, а затем просто сможет обновить/получить доступ к нему с других виртуальных машин, без необходимости явно программировать, какая виртуальная машина может. Сделал бы жизнь намного проще.

В своем ответе, пожалуйста, постарайтесь не предлагать фреймворки. Хотя есть некоторые действительно хорошие, я хочу быть в состоянии сделать хотя бы это сам.

Например:

MainVM.cs:

public class MainVM 
{ 
    List lst = new List(); //Let's just say it's full... 
} 

OtherVM.cs:

public class OtherVM 
{ 
    lst.Add(3); 
} 

PS: Да, я знаю, что это было уже задавала, да и я сделал мои исследования, НО я ответы, которые я нашел, слишком «статичны», я думаю?

+1

Использование Prism для решения экземпляра вашего MainViewModel. –

ответ

11

Если вы хотите прямой доступ к списку из внешнего ViewModel, то ваши варианты являются:

  1. Пропустите список в OtherVM в качестве аргумента конструктора или общественной собственности. Тогда OtherVM может рассматривать его как члена.

  2. Передайте MainVM в OtherVM как аргумент конструктора или общедоступное свойство. Затем OtherVM может получить доступ к списку, сначала обратившись к MainVM.

  3. Дайте MainVM статическое свойство «По умолчанию» или «Экземпляр», чтобы вы могли получить доступ к статическому экземпляру MainVM из OtherVM, не назначая его как поле участника.

Пример:

public class MainVM 
{ 
    private static MainVM _instance = new MainVM(); 
    public static MainVM Instance { get { return _instance; } } 

    public List<XX> MyList { get; set; } 
    //other stuff here 
} 

//From within OtherVM: 
MainVM.Instance.MyList.Add(stuff); 
+1

Большое вам спасибо! Вариант № 3 выполнил эту работу! Варианты 1 и 2 работают нормально, но по мере роста проекта мне придется передавать экземпляр/список более одного раза, поэтому я думаю, что это не очень хорошая практика для широкомасштабных приложений. – Asaf

+0

@BTownTKD Я знаю, что этот вопрос несколько старый, но у меня есть проблема. Я пробовал ваш код, но в обратном порядке. т. е. я объявил свойство экземпляра на OtherVM, и я хочу получить к нему доступ в mainVM. Я не получаю никаких ошибок, но когда я обращаюсь к любому свойству OtherVM в MainVM, я не получаю значение этого свойства. Я имею в виду, что вместо значения этого свойства я получаю null. – Khushi

+0

Вы хотите опубликовать это как новый вопрос. – BTownTKD

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