Silverlight 更新依赖属性一次而不是两次
在我的ViewModel中,我有两个Datetime类型的属性。它们以XAML和双向模式绑定。当我更新它们中的每一个时,OnPropertyChanged在第三个属性的这个Datetime属性的集合部分中引发。因此,当我同时更新两个Datetime属性时,我只想更新第三个属性一次,而不是更新第三个属性两次。如何归档? 适用代码:Silverlight 更新依赖属性一次而不是两次,silverlight,data-binding,mvvm,viewmodel,inotifypropertychanged,Silverlight,Data Binding,Mvvm,Viewmodel,Inotifypropertychanged,在我的ViewModel中,我有两个Datetime类型的属性。它们以XAML和双向模式绑定。当我更新它们中的每一个时,OnPropertyChanged在第三个属性的这个Datetime属性的集合部分中引发。因此,当我同时更新两个Datetime属性时,我只想更新第三个属性一次,而不是更新第三个属性两次。如何归档? 适用代码: //1 public DateTime StartDate { ... set { this.selectedEndDate =
//1
public DateTime StartDate
{
...
set
{
this.selectedEndDate = value;
this.OnPropertyChanged("StartDate");
this.OnPropertyChanged("MyList");
}
}
//2
public DateTime EndDate
{
...
set
{
this.selectedEndDate = value;
this.OnPropertyChanged("EndDate");
this.OnPropertyChanged("MyList");
}
}
//third property
public IEnumerable<MyObject> MyList
{
get
{
return _data.Where(kvp=> kvp.Key.Date >= Start && kvp.Value.Date <= End).Select(kvp => kvp.Value);
}
}
//1
公共日期时间起始日期
{
...
设置
{
this.selectedededDate=值;
本条关于不动产变更(“起始日期”);
此.OnPropertyChanged(“MyList”);
}
}
//2
公共日期时间结束日期
{
...
设置
{
this.selectedededDate=值;
本协议项下的不动产变更(“终止日期”);
此.OnPropertyChanged(“MyList”);
}
}
//第三财产
公共IEnumerable MyList
{
得到
{
返回_data.Where(kvp=>kvp.Key.Date>=Start&&kvp.Value.Date kvp.Value);
}
}
在我看来,用户第一次更改开始日期第二次更改结束日期?反之亦然
下面的代码有一个机会
bool fistChanged,endChanged;
on Ctor (Constructor)
this.PropertyChanged+=(s,p)=>
{
if(p.PropertyName=="firstDate")
{
firstChanged=true;
}
if(p.PropertyName=="endDate")
{
endChanged=true;
}
if(firstChanged && endChanged)
{
this.OnPropertyChanged("MyList");
fistChaned=false;endChanged=false;
}
}
您可以通过一个计时器延迟
MyList
属性更改通知,该计时器在其中一个日期属性更改时启动。这不仅可以避免两个属性“同时”更改时出现双重通知,还可以防止其中一个属性更改过于频繁时出现频繁通知
每次属性更改时,计时器都会通过停止并重新启动来重置,因此在实际通知MyList
属性更改之前,您可以进行许多后续属性更改
下面的代码示例使用来执行此任务。当然,您必须为间隔
值找到一个合理的值
private DispatcherTimer notifyTimer;
public ViewModel()
{
notifyTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(200) };
notifyTimer.Tick += OnNotifyTimerTick;
}
private void OnNotifyTimerTick(object sender, EventArgs e)
{
OnPropertyChanged("MyList");
notifyTimer.Stop();
}
public DateTime StartDate
{
...
set
{
selectedEndDate = value;
OnPropertyChanged("StartDate");
notifyTimer.Stop();
notifyTimer.Start();
}
}
public DateTime EndDate
{
...
set
{
selectedEndDate = value;
OnPropertyChanged("EndDate");
notifyTimer.Stop();
notifyTimer.Start();
}
}
实际上,这些StartDate和EndDate绑定到RadTimeBar telerik控件的SelectedStartDate和SelectedEndDate。因此,可以更改其中一个日期,例如,我只更改SelectedStartDate,第三个属性需要更改为。但当我拖动RadTimeBar的Subrol时,SelectedStartDate和SelectedEndDate都会在很短的时间内发生变化。在两个日期都改变之后,我想更新我的第三个属性。我也使用RadTimeBar,RadTimeLine。我的代码应该对你有帮助。(我只是把Stackoverflow的编辑器写下来)。如果存在拖动操作,您也可以使用事件(例如拖动已完成?)我为ViewModel添加了UpdateDates方法,并在RadTimeBar的SelectionChanged事件处理程序中调用它。这个解决方案不太好,但是谢谢你的想法。如果有人能提出更好的主意,那就太好了。@DavutGürbüz实际上它不是另一个线程,只是UI线程上的一个计时器。我没有注意到“Dispatcher”,我认为是常规计时器,你肯定是对的。