我正在尝试使用PropertyChangedEventHandler
更新属性,但我认为我对其工作方式的概念性理解可能有点缺陷。因为我是WPF和银光的新手。
所以,让我解释一下,我有一个设置为0的属性,但是在一段时间之后,一个线程在内部将值从0更改为9,但是尽管值发生了变化,这个属性永远不会在实际视图中更新我不知道为什么!即使在我实现PropertyChangedEventHandler
之后也没有变化,但如果我记录该属性,则表明该值实际上是9
以下是实现PropertyChangedEventHandler
的代码片段:
public class CustomColumn : IColumnViewable, INotifyPropertyChanged
{
...
public event PropertyChangedEventHandler PropertyChanged = delegate { };
public void OnPropertyChanged(string propertyName)
{
Foo.log.Error(": start on property change");
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
Foo.log.Error(": end on property change");
}
public static string _total;
public string total { get { return _total; } set { _total = value; OnPropertyChanged("total"); Foo.log.Error(": property change"); } }
...
}
这是我的xaml的一部分:
<DataTemplate x:Key="ColumnView">
<UserControl HorizontalAlignment="Stretch">
<StackPanel HorizontalAlignment="Stretch">
...
<RichTextBox Margin="5,2,5,2">
<Paragraph>
<Run Text="{Binding Path=total, Mode=OneWay}" FontWeight="Bold" FontSize="30" />
<Run Text=" total clicks" FontWeight="Bold" />
</Paragraph>
</RichTextBox>
...
<ContentControl VerticalAlignment="Stretch" Content="{Binding Path=timeline}" ContentTemplate="{Binding Path=timelineView.ContentTemplate}" />
</StackPanel>
</UserControl>
</DataTemplate>
我在初始化时这样做:
CustomColumn content = new CustomColumn();
content.total = "0";
然后我将对象传递给一个线程,在某些时候这样做:
content.total = "9";
Foo.log.Error("value is "+content.total);
该物业永远不会更新,我不知道为什么 - 非常感谢任何帮助
答案 0 :(得分:1)
如果我了解您问题的详细信息,那么您将在后台线程上更新UI绑定值。您需要在UI线程上进行此操作,否则更改将不可见。在我们的一个WPF应用程序中,随机更新消失,直到我们意识到这一点。
我们在Silverlight(和WPF)应用程序中做了很多多线程,所以为了避免这个问题,我们在一个基类中实现了我们的通知助手,如下所示(其他东西被修剪掉)。它在主UI线程上调度所有通知消息。试一试:
public class ViewModelBase : INotifyPropertyChanged
{
protected delegate void OnUiThreadDelegate();
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void SendPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
// Ensure property change is on the UI thread
this.OnUiThread(() => this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)));
}
}
protected void OnUiThread(OnUiThreadDelegate onUiThreadDelegate)
{
// Are we on the Dispatcher thread ?
if (Deployment.Current.Dispatcher.CheckAccess())
{
onUiThreadDelegate();
}
else
{
// We are not on the UI Dispatcher thread so invoke the call on it.
Deployment.Current.Dispatcher.BeginInvoke(onUiThreadDelegate);
}
}
}
答案 1 :(得分:0)
您的代码未显示您将对象设置为控件的DataContext
的位置,这对于未指定其他源并因此绑定到DataContext
的绑定是必需的。
CustomColumn content = new CustomColumn();
content.total = "0";
在此对象传递给您的视图后,您是否有任何行?