Silverlight 更新依赖属性一次而不是两次

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 =

在我的ViewModel中,我有两个Datetime类型的属性。它们以XAML和双向模式绑定。当我更新它们中的每一个时,OnPropertyChanged在第三个属性的这个Datetime属性的集合部分中引发。因此,当我同时更新两个Datetime属性时,我只想更新第三个属性一次,而不是更新第三个属性两次。如何归档? 适用代码:

//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”,我认为是常规计时器,你肯定是对的。