我有一个代表计时器的简单类(为简洁起见而简化):
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;
}
}
包含TextBlock
和Timer
实例的页面。
我想对TextBlock
的{{1}}属性进行数据绑定以显示Text
。然而,这个领域显然在不断变化,所以发起Timer.Value
事件似乎没有任何意义。
是否有某种方法可以指示属性总是在变化,以便UI尽可能快地更新?
答案 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中的代码,将为您完成。