更新silverlight中的属性绑定

时间:2011-06-24 18:15:30

标签: c# wpf silverlight xaml

我正在尝试使用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);

该物业永远不会更新,我不知道为什么 - 非常感谢任何帮助

2 个答案:

答案 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";

在此对象传递给您的视图后,您是否有任何行?