我怎样才能对不断变化的财产进行数据处理

时间:2012-11-24 22:04:02

标签: silverlight windows-phone-7 data-binding

我有一个代表计时器的简单类(为简洁起见而简化):

public class Timer {
    DateTime startTime;

    // How do I notify the UI that this property is changing?
    public TimeSpan Value {
        get {
            return DateTime.Now - startTime;
        }
    }
    public void Start() {
        startTime = DateTime.Now;
    }
}

包含TextBlockTimer实例的页面。

我想对TextBlock的{​​{1}}属性进行数据绑定以显示Text。然而,这个领域显然在不断变化,所以发起Timer.Value事件似乎没有任何意义。

是否有某种方法可以指示属性总是在变化,以便UI尽可能快地更新?

3 个答案:

答案 0 :(得分:1)

这就是PropertyChanged的目的。用户界面应该能够应对不断变化的价值。

但是,为了确保您不会泛滥UI,您应该使用一个计时器来控制每个节拍的间隔:

System.Threading.Timer myTimer;

TimerCallback callback = TimerTick;
myTimer = new System.Threading.Timer(callback, null, 0, 1000);

这会立即启动一个计时器(0),每秒触发一次(1000)。您的TimerCallback看起来像这样:

void TimerTick(object stateInfo)
{
    // Raise property changed event with DateTime.Now
}

答案 1 :(得分:1)

这就是我提出的:

public class ObservableTimer : Timer, INotifyPropertyChanged {
    public event PropertyChangedEventHandler PropertyChanged;
    // some extension methods are being used here
    public PropertyChangedEventArgs pcValue = Property.Changed<ObservableTimer>(t => t.Value);

    DispatcherTimer dTimer;

    public ObservableTimer() {
        dTimer = new DispatcherTimer();
        dTimer.Interval = TimeSpan.FromMilliseconds(50);
        dTimer.Tick += onTimerTick;
        dTimer.Start();
    }

    private void onTimerTick(object sender, EventArgs e) {
        // some extension methods are being used here
        PropertyChanged.Raise(this, pcValue);
    }
}

ChrisF's answer所述,它使用计时器定期触发PropertyChanged事件。

答案 2 :(得分:0)

这是你可以做的,你有这个课,

public class Timer {
DateTime startTime;

// How do I notify the UI that this property is changing?
public TimeSpan Value {
    get {
        return DateTime.Now - startTime;
    }
}
public void Start() {
    startTime = DateTime.Now;
}

}

首先将INotifyPropertyChanged应用于属性值。

现在在XAML中你可能有一个网格。您需要将网格的“Datacontext”绑定到Timer类的当前实例。 因为有很多方法,其中最简单的就是将网格命名为(作为RootGrid)。 现在处于用户控件的加载事件中:

private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
       RootGrid.DataContext = this;
    }

Ok游戏结束,最后一步是将TextBlock的Text属性绑定到“Value”。

<TextBlock Text="{Binding Value}"/>

以及XAML中的代码,将为您完成。