【发布时间】:2011-11-30 18:57:22
【问题描述】:
Windows phone 上的数据绑定存在问题(使用 xaml)。我创建了一个简单的示例,它应该允许重现该问题。 这是我们的模型类:
public class Data : INotifyPropertyChanged
{
private int value = 0;
public int Value
{
get
{
return value;
}
set
{
this.value = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Value"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public Data()
{
var t = new Thread(new ThreadStart(() =>
{
while (true)
{
Thread.Sleep(2000);
Value += 1;
}
}));
t.IsBackground = true;
t.Start();
}
}
它使用线程来更新值属性并触发 PropertyChanged 事件。
现在我想将此值属性绑定到 gui 控件:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<TextBlock Text="{Binding Path=Value}" />
</Grid>
public MainPage()
{
InitializeComponent();
DataContext = new Data();
}
当值第一次改变时(并且 PropertyChanged 事件被触发),数据绑定系统尝试将 Data.Value 的值复制到 TextBlock.Text,这会导致无效的跨线程异常,因为该事件不是在 ui 线程上触发。
我的问题:.NET 数据绑定框架不应该识别我正在绑定到 ui 控件并自行执行线程切换吗?我知道我可以简单地使用调度程序在主线程上触发 PropertyChanged 事件,但我想让我的模型类与 gui 组件更加分离。 这个问题有更好的解决方案吗?我无法使用 DependencyObject 方法,因为我们的核心项目(包含模型类)应该在 Windows Phone 和 Android 上运行,而 Android 不支持 System.Windows-namespace。
【问题讨论】:
标签: c# windows-phone-7 data-binding multithreading