Как вы получаете доступ к MainViewModel в ViewModelLocator из кода позади? - PullRequest
4 голосов
/ 12 августа 2011

Создание приложения WP7 с использованием MVVM light для моделей моего вида.Я использую ViewModelLocator, который добавляется при добавлении библиотеки через NuGet.Работает отлично, но теперь мне нужно получить доступ к ViewModel из кода.

В моем коде пользователь нажимает кнопку, и мне нужно найти MainViewModel (которая содержит несколько моделей представления) и найти одну на основе критериевпользователь ввел.

Обычно я просто отвечал бы на событие Click кнопки, но у меня нет переменной экземпляра класса ViewModelLocator, чтобы получить MainViewModel для выполнения поиска.С шаблоном по умолчанию (не MVVMLight) для Windows Phone 7 класс App имеет статическую переменную для модели основного вида, поэтому вы можете получить к ней доступ в любое время с помощью App.ViewModel.

В Twitter есть разговоры об использованииКоманды, которые были бы хорошими, но в какой-то момент я должен выполнить поиск кода по нескольким vms, чтобы получить нужные мне результаты.Вероятно, нужно внедрить службу ISearchViewModel в View или что-то для этой работы.

Ниже приведена реализация ViewModelLocator:

public class ViewModelLocator
{
    private static MainViewModel _main;

    public ViewModelLocator()
    {
        _main = new MainViewModel();
    }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
    "CA1822:MarkMembersAsStatic",
    Justification = "This non-static member is needed for data binding purposes.")]
    public MainViewModel Main
    {
        get
        {
            return _main;
        }
    }
}

Итак, из кода позади другого представления,как вы получаете доступ к Main (MainViewModel содержит все списки данных и имеет метод поиска, который я вызываю)?Или вам стоит?

Просто интересно, как люди решают этот тип проблемы?

Спасибо.

Ответы [ 4 ]

14 голосов
/ 13 августа 2011

В MVVM-Light ViewModelLocator предоставляется в качестве ресурса приложения. Поэтому вы все равно можете получить к нему прямой доступ, но синтаксис другой. Если вы посмотрите на свой App.xaml, вы должны где-то увидеть этот кусок кода.

<Application.Resources>
    <vm:ViewModelLocator x:Key="Locator"
                         d:IsDataSource="True" />
</Application.Resources>

Из любого места в вашем приложении вы можете получить доступ к ресурсам приложения и, следовательно, к MainViewModel с этим фрагментом кода:

(App.Current.Resources["Locator"] as ViewModelLocator).Main

Это работает для любого ресурса приложения.

4 голосов
/ 13 августа 2011

Если вы создали ViewModelLocator, как в шаблоне, у вас есть статические ссылки на ViewModels. mvvmlocatorproperty -snippet создает свойства ViewModel следующим образом. Это означает, что вы можете просто создать новый ViewModelLocator, чтобы найти ViewModels в вашем коде за нажатием кнопки. Это всегда будут одни и те же модели представления независимо от различных экземпляров ViewModelLocator

2 голосов
/ 12 августа 2011

Для доступа к MainViewModel из вашего кода вы можете добавить это свойство в свой класс:

public ViewModel.MainViewModel myContext { get { return (DataContext as ViewModel.MainViewModel); } }

Тогда вы можете просто использовать myContext. [что угодно]

0 голосов
/ 13 августа 2011

Вы можете просто использовать ViewModelLocator.MainViewModelStatic.Шаблон по умолчанию для MVVMLight имеет статическое свойство для каждой вашей модели представления.

...