Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf ViewModels与Messenger系统的交叉火力导致问题_Wpf_Mvvm_Viewmodel_Light_Mediator - Fatal编程技术网

Wpf ViewModels与Messenger系统的交叉火力导致问题

Wpf ViewModels与Messenger系统的交叉火力导致问题,wpf,mvvm,viewmodel,light,mediator,Wpf,Mvvm,Viewmodel,Light,Mediator,我的按钮栏上有一个DateNavigatorViewModel+DateNavigatorView 以下是交换的两种观点: DailyView和WeeklyView。每个视图都有DailyViewModel和WeeklyViewModel 在我的DateNavigator视图模型中,我有messenger.Send(SelectedDate) 在my DailyViewModel和WeeklyViewModel中,构造函数中的每个寄存器: messenger.Register<DateTi

我的按钮栏上有一个DateNavigatorViewModel+DateNavigatorView

以下是交换的两种观点: DailyView和WeeklyView。每个视图都有DailyViewModel和WeeklyViewModel

在我的DateNavigator视图模型中,我有
messenger.Send(SelectedDate)

在my DailyViewModel和WeeklyViewModel中,构造函数中的每个寄存器:

messenger.Register<DateTime>(this, LoadDailyData);
messenger.Register<DateTime>(this, LoadWeeklyData);
messenger.Register(此为LoadDailyData);
messenger.Register(此为LoadWeeklyData);
猜猜当我选择一个日期时会发生什么

我正在使用MVVM Light工具包


如何解决从数据库中获取2倍数据的问题?

在数据访问层中,您可以使用存储在某个静态字典中的缓存,从数据库中加载所需的所有数据,以便在数据层中查看和筛选各个ViewsModel


或者,由数据对象接收DateChanged消息,加载数据,然后由两个视图引发并接收第二条消息。

MainViewModel将实例化:

单击每日按钮实例化:

public DailyViewModel(IMessenger messenger)
        {
            _messenger = messenger;
            _messenger.Register<DateNavigatorInfoObject>(this, LoadDailyData);

        }

        private void LoadDailyData(DateNavigatorInfoObject infoObject)
        {
            if (infoObject.DateNavigatorMode != DateTest.DateMode.Day)
                return;

            // get daily database stuff
        }
public WeeklyViewModel(IMessenger messenger)
{
    _messenger = messenger;
    _messenger.Register<DateNavigatorInfoObject>(this, LoadWeeklyData);                
}

private void LoadWeeklyData(DateNavigatorInfoObject infoObject)
{
    if (infoObject.DateNavigatorMode != DateTest.DateMode.Week)
       return;

    // get weekly database stuff
}
现在是触发设置日期时间的属性。现在是在Ctor中

private DateTime _selectedDate;
        public DateTime SelectedDate
        {
            get { return _selectedDate; }
            set
            {
                if (_selectedDate.Date == value.Date)
                    return;

                _selectedDate = value;
                this.RaisePropertyChanged("SelectedDate");


                var infoObject = new DateNavigatorInfoObject();
                switch (DateNavigatorMode)
                {    
                    case DateTest.DateMode.Day:
                        infoObject.DateNavigatorMode = DateNavigatorMode;
                        infoObject.SelectedStartDate = value;
                        break;

                    case DateTest.DateMode.Week:
                        infoObject.DateNavigatorMode = DateNavigatorMode;
                        infoObject.SelectedStartDate = value;
                        infoObject.SelectedEndDate = value.AddDays(6);
                        break;
                }

                _messenger.Send(infoObject);                
            }

public class DateTest
    {
        public enum DateMode
        {
            Day,
            Week,
            Month,
        }
    }
infoObject会同时发送到Daily和WeeklyViewModel,但根据DateNavigatorMode的不同,数据库获取会被ViewModel拒绝

对我来说,这是一个解决方案,因为它首先有效,其次不涉及DAL,只涉及ViewModels


如果您喜欢,可能会有人将其标记为解决方案。也欢迎批评,也许我还能改进一些东西?

你不让我猜怎么样?你是什么意思?所有信息都张贴在上面??啊。。。我看到的最后一句话你没听懂。DateTime值被发送到两个ViewModels,因此我获得了两次数据。。。不是很酷吧?第一个对我的场景不起作用,因为性能太慢,前后切换日历。。。请你再解释一下第二个建议好吗?我不明白你的意思。非常感谢。除了缓存的内存使用量略有增加外,我看不出性能会受到什么影响。第二个想法是让数据层响应数据请求,然后加载数据并引发第二条消息,由ViewModels接收,并将数据作为消息参数传递。因此,您只加载一次数据,但将其传递给多个ViewModels接收。要么我不清楚,要么您误解了我的场景。关于性能损失:当我单击moveNextDate按钮时,我现在得到了10行乘以2个RichTextBoxcolumns。这需要一秒钟的时间。如果加载过程中出现任何延迟,我需要一个进度条……我想将DAL排除在这个场景之外,因为它的应用程序逻辑,所以我想在ViewMOdels中解决它。好吧,忘了那个解决方案吧,我明天会发布一个更好的:)更少的代码更少的黑客风格:Pback。。。由于我已经改变了我的要求,每日和每周视图现在有了所有不同的按钮,而不是相同的日期选择器等。。。除了一个带有5个按钮的usercontrol。因此,不再需要搜索合适的算法。但还是要感谢大家的帮助,尤其是本。
private DateTime _selectedDate;
        public DateTime SelectedDate
        {
            get { return _selectedDate; }
            set
            {
                if (_selectedDate.Date == value.Date)
                    return;

                _selectedDate = value;
                this.RaisePropertyChanged("SelectedDate");


                var infoObject = new DateNavigatorInfoObject();
                switch (DateNavigatorMode)
                {    
                    case DateTest.DateMode.Day:
                        infoObject.DateNavigatorMode = DateNavigatorMode;
                        infoObject.SelectedStartDate = value;
                        break;

                    case DateTest.DateMode.Week:
                        infoObject.DateNavigatorMode = DateNavigatorMode;
                        infoObject.SelectedStartDate = value;
                        infoObject.SelectedEndDate = value.AddDays(6);
                        break;
                }

                _messenger.Send(infoObject);                
            }

public class DateTest
    {
        public enum DateMode
        {
            Day,
            Week,
            Month,
        }
    }