引发PropertyChanged用于模型内的属性

本文关键字:属性 模型 PropertyChanged 用于 引发 | 更新日期: 2023-09-27 18:14:21

所以我有一个保存实体数据的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应该为整个列表引发属性更改,但列表框项似乎保持不变。有人能给我点提示吗?

引发PropertyChanged用于模型内的属性

Timers列表没有变化,是Timer对象的Interval属性发生了变化。

我建议一个ViewModel为您的整个视图(设置为DataContext为您的窗口/控件…(不是这个父窗口/控件中的ListBox)包含类型为ObervableCollection<TimerViewModel>的属性Timers。这个TimerViewModel代表一个计时器,应该在属性的setter中为"Interval"引发一个PropertyChanged -Event。

(更多信息见注释)

<ListBox x:Name="lst_timers" ...>
    <ListBox.DataContext>
      <local:TimerViewModel/> 
    </ListBox.DataContext>
</ListBox>