Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight 如何将数据绑定到不断变化的属性_Silverlight_Windows Phone 7_Data Binding - Fatal编程技术网

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);
    }
}