0

在我的 ViewModel 中,我有两个属性类型的 Datetime。它们以 TwoWay 模式绑定在 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);
    }
}
4

2 回答 2

2

您可以通过每当日期属性之一更改时启动的计时器来延迟MyList属性更改通知。这不仅可以在两个属性“同时”更改时避免双重通知,而且还可以防止在其中一个属性更改过于频繁时出现频繁通知。

通过停止并重新启动计时器,每次属性更改都会重置计时器,因此您可以在实际通知属性更改之前进行许多后续属性MyList更改。

下面的代码示例使用DispatcherTimer来执行此任务。当然,您必须为该值找到一个合理的Interval值。

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();
    }
}
于 2013-02-23T19:04:27.280 回答
0

正如我所看到的,用户更改 startDate 拳头 endDate 秒。? 或相反亦然。

下面的代码有机会,

        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;
                }
         }
于 2013-02-23T13:49:51.337 回答