MEF Импортирует ViewModel, которому нужны данные, в View for Silverlight - PullRequest
1 голос
/ 09 июля 2011

Я не уверен, что лучший способ добиться этого.Вот мой взгляд:

public partial class MyPage : Page
{
    [Import]
    public MyVM ViewModel
    {
        get { return DataContext as MyVM ; }
        set { DataContext = value; }
    }

    public String EventName { get; set; }
    public MyPage()
    {
        InitializeComponent();
        CompositionInitializer.SatisfyImports(this);
    }

    // Executes when the user navigates to this page.
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {       }
}

И моя виртуальная машина:

[Export]
public class MyVM : ViewModelBase
{
    public MyVM ()
    {

    }
}

Это прекрасно работает.Однако мне нужно получить данные либо из модели представления, в которой есть моя строка, либо из URL.В любом случае, я не уверен, что лучший способ передать строку в MyVW с помощью MEF.Я подумал, хорошо, что я буду использовать Messaging из MVVMLight, но класс MyVM еще не создан для получения трансляции из другой ViewModel.Тогда я хорошо подумал, я попробую это:

[Export]
public class MyVM : ViewModelBase
{
    public MyVM ([Import("hello")]string hello)
    {

    }
} 

, а затем выведу это на экран:

[Export("hello")]
public String MyHello { get; set; }

но это дало мне ошибку.Невозможно вызвать SatisfyImports для объекта типа «Форма A», поскольку он помечен одним или несколькими объектами ExportAttributes.

Итак, как лучше всего это сделать?

1 Ответ

0 голосов
/ 10 июля 2011

Для обмена данными между представлениями я обычно внедряю объект SharedData в мои ViewModels.

 [Import(RequiredCreationPolicy = CreationPolicy.Shared)]
 public ISharedData SharedData { get; set; }

Я также использую платформу Caliburn Micro, поэтому я не передаю данные через строку запроса URL. По соглашению CM будет анализировать параметры URL-адресов и вставлять их в свойства вашей виртуальной машины, но я не уверен, применима ли эта функция только к разработке Windows Phone.

от здесь

Проверьте QueryString страницы. Посмотрите для свойств на ВМ, которые соответствуют параметры QueryString и внедрить их, выполняя необходимый тип принуждение.

Когда вы говорите, что хотите передать данные из представления в vm, это должно произойти с помощью привязки данных.

...