【发布时间】: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
-
我发布了示例代码,以显示更改所选索引时如何更改
-
在交换模型时,您需要在执行此操作时关闭日期验证,或者您需要将最小/最大值设置为交换之间的完整范围。