所以我有一个TimerModel来保存实体的数据,还有一个TimerViewModel来处理来自每个定时器的定时器滴答。它只是将TimeSpan设置减少为计时器的间隔 - 我这样做纯粹是因为我需要用剩余时间更新视图。
public class TimerModel
{
public TimerModel(TimeSpan Interval, TimerViewModel Parent)
{
Timer = new DispatcherTimer();
Timer.Interval = TimeSpan.FromSeconds(1);
parent = Parent;
this.Interval = Interval;
Timer.Tick += (sender, args) => parent._timer_Tick(this, args);
Timer.Start();
}
private TimerViewModel parent;
public DispatcherTimer Timer
{
get;
private set;
}
public TimeSpan Interval
{
get;
set;
}
}
TimerViewModel将是:
public class TimerViewModel : ViewModelBase
{
public TimerViewModel()
{
Timers = new ObservableCollection<TimerModel>();
AddTimerCommand = new RelayCommand((object x) => { AddTimer(x); });
}
public ObservableCollection<TimerModel> Timers
{
get;
private set;
}
public ICommand AddTimerCommand
{
get;
private set;
}
private void AddTimer(object s)
{
Timers.Add(new TimerModel(TimeSpan.FromSeconds(250), this));
}
internal void _timer_Tick(object sender, EventArgs e)
{
TimerModel timer = sender as TimerModel;
timer.Interval = timer.Interval.Subtract(TimeSpan.FromSeconds(1));
RaisePropertyChanged("Timers");
}
}
哪个绑定到列表框:
<ListBox x:Name="lst_timers" Height="300" Width="150" HorizontalAlignment="Left"
DataContext="{Binding local:TimerViewModel}" ItemsSource="{Binding Timers}"
DisplayMemberPath="Interval" />
_timer_Tick应该提升整个列表的属性,但似乎列表框项目保持不变。 谁能给我一个线索,我在这里错过了什么?
答案 0 :(得分:1)
Timers
列表没有变化,它是Interval
对象的Timer
属性发生了变化。
我建议你的整个视图使用一个ViewModel(设置为你的窗口/控件的DataContext ...,而不是这个父窗口/控件中的ListBox),其中包含{{1}类型的属性Timers
}}。此ObervableCollection<TimerViewModel>
代表一个单一的计时器,并且应该在属性的setter中为TimerViewModel
引发PropertyChanged
- 事件。
(有关其他信息,请参阅评论)
答案 1 :(得分:1)
<ListBox x:Name="lst_timers" ...>
<ListBox.DataContext>
<local:TimerViewModel/>
</ListBox.DataContext>
</ListBox>