Silverlight 如何将数据绑定到不断变化的属性
我有一个表示计时器的简单类(为了清晰起见,简化了): 以及包含Silverlight 如何将数据绑定到不断变化的属性,silverlight,windows-phone-7,data-binding,Silverlight,Windows Phone 7,Data Binding,我有一个表示计时器的简单类(为了清晰起见,简化了): 以及包含文本块和计时器实例的页面 我想对TextBlock的Text属性进行数据绑定,以显示Timer.Value。然而,这个字段显然是不断变化的,因此触发PropertyChanged事件似乎没有任何意义 是否有某种方法表明属性总是在更改,以便UI尽可能快地更新?这就是PropertyChanged的设计目的。UI应该能够处理不断变化的值 但是,为了确保您不会淹没UI,您应该使用一个计时器来控制每个滴答声的间隔: System.Thread
文本块
和计时器
实例的页面
我想对TextBlock
的Text
属性进行数据绑定,以显示Timer.Value
。然而,这个字段显然是不断变化的,因此触发PropertyChanged
事件似乎没有任何意义
是否有某种方法表明属性总是在更改,以便UI尽可能快地更新?这就是
PropertyChanged
的设计目的。UI应该能够处理不断变化的值
但是,为了确保您不会淹没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
}
这是你能做的,你有这门课
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”绑定到计时器类的当前实例。
为此,有很多方法,其中最简单的是将网格命名为RootGrid。
现在在用户控件的已加载事件中:
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
RootGrid.DataContext = this;
}
游戏结束,最后一步是将TextBlock的文本属性绑定到您的“值”
以上XAML代码将为您提供帮助。这就是我的想法:
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);
}
}
公共类ObservateTime:计时器,INotifyPropertyChanged{
公共事件属性更改事件处理程序属性更改;
//这里使用了一些扩展方法
公共属性changedventargs pcValue=Property.Changed(t=>t.Value);
调度员数据计时器;
公共观察者(){
dTimer=newdispatchermer();
dTimer.Interval=时间跨度从毫秒(50);
dTimer.Tick+=onTimerTick;
dTimer.Start();
}
私有void onTimerTick(对象发送方,事件参数e){
//这里使用了一些扩展方法
PropertyChanged.Raise(这个,pcValue);
}
}
如中所述,这使用计时器定期触发
PropertyChanged
事件。因此,本质上,我需要自己使用System.Threading.timer
或Dispatcher
定期触发property changed事件-无法将属性标记为“不稳定”而且它是自动处理的吗?可能的重复没有帮助-我的问题是“如何将INotifyPropertyChanged应用于值
属性?”
<TextBlock Text="{Binding Value}"/>
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);
}
}