OnPropertyChange Firing Order

时间:2012-08-15 15:08:04

标签: c# wpf xaml mvvm

我有一个应用程序,您可以在ListBox中的不同对象之间进行选择。选择对象时,它会更改控件的viewmodel。该控件从CodePlex获取时间轴控件,因此,我将StartDate和EndDate用于绑定到ViewModel的时间轴数据。 ViewModel更改后,我有时会收到错误:

ArgumentOutOfRangeException: MaxDateTime cannot be less then MinDateTime

仅当我从较晚的日期到较早的日期时才会发生这种情况。我很确定这是由于属性自动更新到视图的方式。这是相关的XAML。

MaxDateTime="{Binding Path=RecordingEnd}" 
MinDateTime="{Binding Path=RecordingStart}" 
CurrentDateTime="{Binding Path=CurrentDateTime, Mode=TwoWay}"

ViewModel有:

        private int myObjectIndex;
        public int MyObjectIndex
        {
            get { return myObjectIndex; }
            set { myObjectIndex = value; OnPropertyChanged("MyObjectIndex"); MyObject = MyObjects[myObjectIndex]; }
        }

        private MyObjectViewModel myObject=new MyObjectViewModel();

        public MyObjectViewModel MyObject            {
            get { return myObject; }
            set
            {
                myObject= value;
                OnPropertyChanged("MyObject");
            }
        }

有解决这个问题的方法吗?有没有办法告诉WPF应该更新对象中的参数的顺序?

更新: 我最终使用了@colinsmith的回复变体:

public MyObjectViewModel MyObject {
    get { return myObject; }
    set 
    {
        myObject= new MyObjectViewModel();
        OnPropertyChanged("MyObject");

        myObject= value;
        OnPropertyChanged("MyObject");    
    } 
}

2 个答案:

答案 0 :(得分:1)

你可以试试这个:

public MyObjectViewModel MyObject            {
            get { return myObject; }
            set
            {
                myObject=null;
                OnPropertyChanged("MyObject");

                myObject= value;
                OnPropertyChanged("MyObject");
            }
        }

答案 1 :(得分:0)

您可以处理这样一个事实,即在最大数据时间之前可以更新最小日期时间并使某些内容无效(即延迟设置最大值或最小值,直到更新最大值和最小值)。这可能非常容易出错。或者,您可以将max和min设置为相同的值,以便它们只能同时更新。例如而不是让RecordingEndRecordingStart RecordingSpan同时包含最大值和最小值。