Связывание WPF DataContext с параметризованным конструктором [duplicate]

TL; DR: Попробуйте использовать Html.Partial вместо Renderpage


Я получал Object reference not set to an instance of an object, когда пытался сделать вид в представлении, отправив ему модель, например это:

@{
    MyEntity M = new MyEntity();
}
@RenderPage("_MyOtherView.cshtml", M); // error in _MyOtherView, the Model was Null

Отладка показала, что модель была Null внутри MyOtherView. Пока я не сменил его на:

@{
    MyEntity M = new MyEntity();
}
@Html.Partial("_MyOtherView.cshtml", M);

И это сработало.

Кроме того, причина, по которой я не имел Html.Partial для начала, заключалась в том, что Visual Studio иногда выдает ошибки, (f9), если он находится внутри другого построенного цикла foreach, хотя это не ошибка:

@inherits System.Web.Mvc.WebViewPage
@{
    ViewBag.Title = "Entity Index";
    List<MyEntity> MyEntities = new List<MyEntity>();
    MyEntities.Add(new MyEntity());
    MyEntities.Add(new MyEntity());
    MyEntities.Add(new MyEntity());
}
<div>
    @{
        foreach(var M in MyEntities)
        {
            // Squiggly lines below. Hovering says: cannot convert method group 'partial' to non-delegate type Object, did you intend to envoke the Method?
            @Html.Partial("MyOtherView.cshtml");
        }
    }
</div>

Но я смог запустить приложение без проблем с этим " ошибка". Я смог избавиться от ошибки, изменив структуру цикла foreach, чтобы выглядеть так:

@foreach(var M in MyEntities){
    ...
}

Хотя я чувствую, что это потому, что Visual Studio неправильно интерпретировала амперсанды и скобки .

4
задан Scifiballer24 21 January 2011 в 06:12
поделиться

3 ответа

Вы можете посмотреть примерные приложения Framework WPF Application Framework (WAF) . В этих примерах контейнер IoC (в вашем случае его Единство) несет ответственность за создание ViewModels. Таким образом, ViewModel может иметь параметры конструктора. Контейнер IoC также несет ответственность за совместное использование View вместе с ViewModel. Возможно, это вариант для вашего дизайна ViewModel.

5
ответ дан jbe 3 September 2018 в 13:39
поделиться

Я не использую единство или призму. Но почему бы вам просто не сделать это:

userControl.DataContext = ribbonViewModelInstance;

У вас может быть свойство зависимостей в пользовательском элементе управления, который установлен. При установке значения этого свойства зависимостей вы можете установить datacontext.

1
ответ дан P.K 3 September 2018 в 13:39
поделиться

Рассмотрим использование ViewModelLocator. Вместо привязки datacontext к ViewModel в вашем случае выше вы привязываетесь к локатору, который знает, как разрешить ViewModel из контейнера (единства) и в процессе вложить любые зависимости в конструктор.

Я полагаю, что EventAggregator зарегистрирован в контейнере по умолчанию, поэтому он опубликовал запись в блоге John Papa и Glenn Block (один из людей за призмой). должен быть автоматически подключен к VM при разрешении VM из контейнера.


Следует упомянуть, что код из выше блога использует MEF. Этот блог , я считаю, имеет пример кода с использованием единицы

2
ответ дан Pero P. 3 September 2018 в 13:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: