为模型内的属性引发PropertyChanged

时间:2011-11-14 09:15:12

标签: c# wpf binding mvvm

所以我有一个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应该提升整个列表的属性,但似乎列表框项目保持不变。 谁能给我一个线索,我在这里错过了什么?

2 个答案:

答案 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>