Автоматическое обновление свойства зависимости (Datetime с таймером) - PullRequest
1 голос
/ 27 марта 2012

У меня есть следующее свойство зависимости, которое работает нормально, но не выполняет автоматическое обновление. Свойства зависимостей - это все свойства класса RegistrationButton.cls.

public static readonly DependencyProperty DuurStilstandProperty =
        DependencyProperty.Register("DuurStilstand", typeof(string), typeof(RegistrationButton), new UIPropertyMetadata(""));

.NET публичная собственность.

 public string DuurStilstand
    {
        get { return (string)GetValue(DuurStilstandProperty); }
        set { SetValue(DuurStilstandProperty, value); }
    }

Что я в основном делаю, так это пытаюсь отобразить время (DateTime со значением по умолчанию 3 минуты), и после этого время продолжает увеличиваться с помощью таймера и увеличивает Datetime на 1 секунду каждую секунду.

Таким образом, на экране должно отображаться 00:03:00, и оно начинает увеличиваться каждую секунду.

Я пробовал привязку TwoWay (не уверен, что это проблема?), Но когда я пытаюсь выполнить следующее, происходит сбой моего приложения:

public static readonly DependencyProperty DuurStilstandProperty =
       DependencyProperty.Register("DuurStilstand", typeof(string), typeof(RegistrationButton), new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

Код, который предусматривал создание кнопки (где отображается время) и таймера:

public void InitializeDispatcherTimerStilstand()
    {
        timerStilstand = new DispatcherTimer();
        timerStilstand.Tick += new EventHandler(timerStilstand_Tick);
        timerStilstand.Interval = new TimeSpan(0, 0, 1);
        timerStilstand.Start();
        timerStilstand.ToString();
    }

    private void timerStilstand_Tick(object sender, EventArgs e)
    {
        this.tijdStilStandRegistrationBtn.AddSeconds(1);
    }

Код, который создает кнопку:

Btn.Duurstilstand - это свойство, которое содержит время (формат чч: мм: сс).

tijdStilStandRegistrationBtn = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 3, 0); 

        RegistrationButton btn = new RegistrationButton(GlobalObservableCollection.regBtns.Count.ToString());
        btn.RegistrationCount = GlobalObservableCollection.regBtnCount;
        btn.Title = "btnRegistration" + GlobalObservableCollection.regBtnCount;
        btn.BeginStilstand = btn.Time;
        btn.DuurStilstand = String.Format("{0:T}", this.tijdStilStandRegistrationBtn);

        GlobalObservableCollection.regBtns.Add(btn);
        GlobalObservableCollection.regBtnCount++;

        InitializeDispatcherTimerStilstand();   

В настоящее время кажется, что 00:03:00 отображается только как время, но не обновляется, когда моя программа работает.

Я также попытался установить для свойства UpDateSourceTrigger значение PropertyChanged, но это не имело никакого значения (это находится в стиле типа RegistrationButton).

<TextBlock x:Name="tbDuurStilstand" TextWrapping="Wrap" 
                                   Text="{Binding DuurStilstand, UpdateSourceTrigger=PropertyChanged}" 
                                   HorizontalAlignment="Center"
                                   VerticalAlignment="Center" 
                                   Margin="7.5,5,0,0" Height="24.8266666666667"/>

EDIT

public void CreateRegistrationButton()
    {
        tijdStilStandRegistrationBtn = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 3, 0); 

        RegistrationButton btn = new RegistrationButton(GlobalObservableCollection.regBtns.Count.ToString());
        btn.RegistrationCount = GlobalObservableCollection.regBtnCount;
        btn.Title = "btnRegistration" + GlobalObservableCollection.regBtnCount;
        btn.BeginStilstand = btn.Time;
        //btn.DuurStilstand = String.Format("{0:T}", this.tijdStilStandRegistrationBtn);

        GlobalObservableCollection.regBtns.Add(btn);
        GlobalObservableCollection.regBtnCount++;

        InitializeDispatcherTimerStilstand(btn);     
    }

РЕДАКТИРОВАТЬ 2:

timerStilstand.Tick += () => timerStilstand_Tick(btn); //error at ()

«Делегат« System.EventHandler »не принимает 0 аргументов»

С уважением.

1 Ответ

2 голосов
/ 27 марта 2012

DateTime является неизменной структурой .Вы должны поймать результат.
Я думаю, что вам нужно:

private void timerStilstand_Tick(object sender, EventArgs e)
{
    this.tijdStilStandRegistrationBtn = 
        this.tijdStilStandRegistrationBtn.AddSeconds(1);

    btn.DuurStilstand = 
        String.Format("{0:T}", this.tijdStilStandRegistrationBtn);

}

Take 2

public void InitializeDispatcherTimerStilstand(RegistrationButton btn)
{
    timerStilstand = new DispatcherTimer();
    //timerStilstand.Tick += new EventHandler(timerStilstand_Tick);
    timerStilstand.Tick += (aa, bb) => timerStilstand_Tick(btn);   // use capturing to pass btn

    timerStilstand.Interval = new TimeSpan(0, 0, 1);
    timerStilstand.Start();
    //timerStilstand.ToString();
}

private void timerStilstand_Tick(RegistrationButton btn)
{
   this.tijdStilStandRegistrationBtn = 
        this.tijdStilStandRegistrationBtn.AddSeconds(1);

    btn.DuurStilstand = 
        String.Format("{0:T}", this.tijdStilStandRegistrationBtn);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...