【问题标题】:OnPropertyChange Firing OrderOnPropertyChange 射击顺序
【发布时间】:2012-08-15 15:08:03
【问题描述】:

我有一个应用程序,您可以在其中选择 ListBox 中的不同对象。当您选择一个对象时,它会更改控件的视图模型。该控件使用 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");    
    } 
}

【问题讨论】:

  • 我假设这三个定义不是这个顺序?您能否澄清“当 ViewModel 被更改时”您所说的“更改”是什么意思?
  • 当您从 UI 中选择一个项目时,它会导致并更新到该对象?
  • 出于好奇,您能否尝试更改您将属性设置为 CurrentDateTime= MinDateTime= MaxDateTime= 的顺序...顺序可能很重要...即您的日期范围在不同模型上有所不同....当模型数据设置到属性中时...您需要它们在更新属性时有效,例如CurrentDateTime 需要在 min/max 范围内......并且 max 需要大于 mindatetime
  • 我发布了示例代码,以显示更改所选索引时如何更改
  • 在交换模型时,您需要在执行此操作时关闭日期验证,或者您需要将最小/最大值设置为交换之间的完整范围。

标签: c# wpf xaml mvvm


【解决方案1】:

你可以试试这个:

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

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

【讨论】:

  • 我之前不得不使用类似的方法 - 它确保在应用新值之前使用空值更新任何绑定。
  • 如果您查看我编辑过的问题,您会发现我不得不将对象设置为空实例而不是 null,因为其他一些对它的引用。不过这效果很好。
  • @jle....这样你就不会在输出窗口处于空状态时出现绑定错误?只是一个建议......您可以在 MyObject 中定义一个“静态”空 MyObject 并指向它,而不是每次都创建一个新的。
【解决方案2】:

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

【讨论】:

  • 我不太清楚您所说的 RecordingSpan 是什么意思?有错误的时间线控件是库的一部分。
猜你喜欢
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 2015-09-14
  • 1970-01-01
  • 2010-10-29
相关资源
最近更新 更多