使用数据注入 ViewModel 会引发异常

发布于 2024-08-29 22:48:41 字数 1541 浏览 6 评论 0原文

我得到的结果是:PresentationFramework.dll 中发生了“System.NullReferenceException”类型的第一次机会异常

当我为我的LessonPlannerViewModel 类的构造函数使用参数时。

我使用 datatemplateselector 类在每周/每日视图之间切换。

public class ApplicationNavigationTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is LessonPlannerViewModel)
        {
            var vm = item as LessonPlannerViewModel;
            Window window = Application.Current.MainWindow;                

            if (vm.IsDailyView)
                return window.FindResource("dailyViewTemplate") as DataTemplate;
            else
                return window.FindResource("weeklyViewTemplate") as DataTemplate;
        }
        return base.SelectTemplate(item, container);
    } 
}

public LessonPlannerViewModel(DateTime asOfDate)
    {
        _asOfDate = asOfDate;

        if(_isDailyView) 
            LoadDailyData();
        if(_isWeeklyView)
            LoadWeeklyData();

……

这是不允许的吗?如果没有参数,我不会有任何异常......

我错了什么?

编辑:现在我将参数更改为整数并得到更好的消息 ;P

XamlParseException=> '在类型'TBM.ViewModel.LessonPlannerViewModel'上找不到匹配的构造函数。您可以使用 Arguments 或 FactoryMethod 指令来构造此类型。行号“13”和行位置“10”。

现在可以理解了,它

<UserControl.Resources>
    <ViewModel:LessonPlannerViewModel x:Key="LessonPlannerViewModelID" />
</UserControl.Resources>

没有参数。

那么现在该怎么办呢?

This I got: A first chance exception of type 'System.NullReferenceException' occurred in PresentationFramework.dll

When I use a parameter for the constructor of my LessonPlannerViewModel class.

I use a datatemplateselector class to switch between weekly/daily view.

public class ApplicationNavigationTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is LessonPlannerViewModel)
        {
            var vm = item as LessonPlannerViewModel;
            Window window = Application.Current.MainWindow;                

            if (vm.IsDailyView)
                return window.FindResource("dailyViewTemplate") as DataTemplate;
            else
                return window.FindResource("weeklyViewTemplate") as DataTemplate;
        }
        return base.SelectTemplate(item, container);
    } 
}

public LessonPlannerViewModel(DateTime asOfDate)
    {
        _asOfDate = asOfDate;

        if(_isDailyView) 
            LoadDailyData();
        if(_isWeeklyView)
            LoadWeeklyData();

...

Is that not allowed? Without the parameter I get no exception...

What do I wrong?

EDIT: NOw I changed the parameter to an integer and got better message ;P

XamlParseException=>
'No matching constructor found on type 'TBM.ViewModel.LessonPlannerViewModel'. You can use the Arguments or FactoryMethod directives to construct this type.' Line number '13' and line position '10'.

ok this is now understandable, that

<UserControl.Resources>
    <ViewModel:LessonPlannerViewModel x:Key="LessonPlannerViewModelID" />
</UserControl.Resources>

has no parameter.

So what to do now?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

断肠人 2024-09-05 22:48:41

您可以使用中介模式在初始化后将数据发送到视图模型。
(使用不带任何参数的视图模型构造函数)

我使用 Laurent Bugnion 的 MVVM Light ToolKit。一个非常好的、轻量级的 mvvm 框架。
这包括一个名为 Messenger 的中介器

否则,您会发现调解器模式的许多来源:Google 搜索 mvvm mediator< /a>

You could use a mediator pattern to send the data to the viewmodel after its initialization.
(Using a viewmodel constructor without any parameters)

I use the MVVM Light ToolKit of Laurent Bugnion. A really nice, light framework for mvvm.
This includes a mediator called Messenger

Otherwise you will find many sources for the mediator pattern: Google Search mvvm mediator

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文