Поднимите PropertyChanged для свойства внутри модели - PullRequest
0 голосов
/ 14 ноября 2011

Итак, у меня есть TimerModel, который содержит данные для сущности, и TimerViewModel, который обрабатывает тики таймера от каждого из таймеров. Это просто уменьшает TimeSpan, установленный как интервал для таймера - я делаю это просто потому, что мне нужно обновить View с оставшимся временем.

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 ]

1 голос
/ 14 ноября 2011
<ListBox x:Name="lst_timers" ...>
    <ListBox.DataContext>
      <local:TimerViewModel/> 
    </ListBox.DataContext>
</ListBox>
1 голос
/ 14 ноября 2011

Список Timers не меняется, меняется свойство Interval объекта Timer.

Я бы предложил ViewModel для всего вашего представления (устанавливается как DataContext для вашего окна / элемента управления ..., а не для ListBox внутри этого родительского окна / элемента управления), содержащее свойство Timers типа ObervableCollection<TimerViewModel>.Это TimerViewModel представляет один таймер и должно вызвать PropertyChanged -Event для "Interval" в установщике свойства.

(дополнительную информацию см. В комментариях)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...