2013-08-11 2 views
1

У меня есть что-то подобное в XAML:Binding Start/Stop текст на Stopwatch.IsRunning - Свойство Изменено

<Button Content="{Binding MyStopwatch.IsRunning, 
     Converter={StaticResource BoolToStr}}"/> 

мне нужно отобразить Пуск, когда IsRunning ложна и Stop, когда IsRunning верно. У меня нет проблем с конвертером или привязкой.

У меня проблема с освежающим IsRunning. Когда IsRunningизменение цен пока программа запущена - это не изменяется Старт/Стоп текст.

Я знаю, как реализовать INotifyPropertyChange по своим собственным характеристикам. Но я не знаю, как реализовать (что-то подобное) изменение свойств на IsRunning

+0

Вы не можете получить уведомление об изменении при привязке к свойству CLR, это должно быть либо свойство зависимости, либо класс должен реализовать INotifyPropertyChanged. –

+0

Оберните свой секундомер в класс, который реализует INotifyPropertyChanged и изменит IsRunning после вызова Start/Stop. –

+0

@Islam - Это совсем не так. Мы можем привязываться к свойству CLR без внедрения INPC. Только проблема заключается в том, что привязка не будет обновляться в графическом интерфейсе при любом изменении свойства. –

ответ

0

Если вы хотите обновить привязки, вы можете вызвать PropertyChanged на имуществе MyStopwatch всякий раз, когда вы начинаете или остановить секундомер.

OnPropertyChanged("MyStopwatch"); 
+0

Это не работает. Я не ожидаю собственности MyStopwatch. Но я ожидаю, что MyStopwatch.IsRunning ... – Alamakanambra

+0

Является ли ваш класс, где 'MyStopwatch' проживает, реализует' INPC', потому что я устал от того, что он отлично работает для меня? –

+0

Ваш полный путь связывания - это 'MyStopwatch.IsRunning', поэтому в случае, если propertyChanged также добавлен в MyStopwatch, он обновит привязки в пользовательском интерфейсе. –

0

Вы не можете сделать StopWatch реализовать INotifyPropertyChanged. Что вы можете сделать, это создать для вас свою собственную оболочку и использовать ее вместо этого. Например:

public class StopwatchWrapper : INotifyPropertyChanged 
{ 
    Stopwatch _stopwatch; 

    private bool _isRunning; 
    public bool IsRunning 
    { 
     get { return _isRunning; } 
     set 
     { 
      if (_isRunning != value) 
      { 
       _isRunning = value; 
       OnPropertyChanged("IsRunning"); 
      } 
     } 
    } 

    public StopwatchWrapper() 
    { 
     _stopwatch = new Stopwatch(); 
     _isRunning = false; 
    } 

    public void Start() 
    { 
     _stopwatch.Start(); 
     IsRunning = _stopwatch.IsRunning; 
    } 

    public void Stop() 
    { 
     _stopwatch.Stop(); 
     IsRunning = _stopwatch.IsRunning; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
Смежные вопросы