datacontext更改时进度条上可能存在的数据绑定错误(Silverlight 4)

时间:2010-07-22 21:26:25

标签: data-binding silverlight-4.0

我有一个限制为2个整数值的进度条 - 一个是总秒数,另一个是剩余的秒数(计时器倒计时:总是< =总秒数)。

我将LayoutRoot datacontext设置为我的顶级对象(其中BlindSet是一个属性 - 请参见代码)。

当我运行项目时,进度条会完美更新。它按预期倒数秒数。然后我通过实例化一个新对象并将其设置为BlindSet类来更改datacontext。我使用DataChanged通知事件让UI知道它已经改变。这也很有效 - 所有其他控件,除了进度条,相应地更新。

让我感到困惑,所以我将其简化为:

2个文本块和进度条,全部绑定到相同的值。 datacontext设置得更高,所以它们都是相同的。

文本块显示倒计时的正确值。 (BlindSet.TimeLeftInCurrentBlind.TotalSeconds在计时器上倒计时)但在更改datacontext后,进度条永远不会再次更新。我甚至尝试在datacontext更改后重新绑定它,但这没有帮助。

我还将进度条上的工具提示绑定到与值设置为相同的值 - 当您将鼠标悬停在非更新进度条上时,您可以看到它正确倒数...但进度条未显示它

我正在做一些非常愚蠢的事(可能;)或者它是进度条控件中的错误。

XAML:

<TextBlock Text="{Binding BlindSet.CurrentBlind.SecondsPerBlind}"  />
<TextBlock Text="{Binding BlindSet.TimeLeftInCurrentBlind.TotalSeconds}" />

<ProgressBar Minimum="0" Maximum="{Binding BlindSet.CurrentBlind.SecondsPerBlind}" Value="{Binding BlindSet.TimeLeftInCurrentBlind.TotalSeconds}" ToolTipService.ToolTip="{Binding BlindSet.TimeLeftInCurrentBlind.SecondsPerBlind}" />

代码背后:

LayoutRoot.DataContext = tournament;

锦标赛有一个BlindSet对象,但我不认为这是问题的一部分,因为其他控件正在更新:

  public Blindset BlindSet
    {
        get { return blindset; }
        set
        {
            if (blindset != value)
            {
                blindset = value;
                OnPropertyChanged("BlindSet");
                OnPropertyChanged("CurrentBlind");
            }
        }
    }

更新:当datacontext发生变化时,可能会有一些内部状态需要使用新的max和value值重新初始化(值非常不同,例如1200秒或120秒)。

当我使用相同的值(即1200秒)绑定到一个新的BlindSet对象时,它会按预期工作 - 所以我想我需要以某种方式给它一个重新计算小或大值变化的一脚 - 任何想法如何?!

2 个答案:

答案 0 :(得分:2)

我刚刚在blog article的评论部分阅读此内容,我希望它有所帮助。

  

大家都知道。 ProgressBar(至少从Silverlight 3开始 - 2009年9月)在数据绑定方面效果不佳。它只是部分有效。因此,您可能需要在设计中考虑这一点,直到修复为止    1)无法在不更改为Null的情况下更改DataContext。因此,继承的绑定通常不起作用。
  2)可见性不能是数据绑定。 (你可以尝试,但它总是像你设置Mode = OneTime一样工作)
  3)其他绑定似乎也不总是稳定的...
  希望能帮助别人避免沮丧。

答案 1 :(得分:0)

好吧,假设您正在对象上实现INotifyPropertyChanged,您必须声明“public Blindset BlindSet”并且“BlindSet”实例上的每个属性都在改变...我是否正确您还需要使用双向绑定,还是考虑输入值?


为了更清楚...... BlindSet.CurrentBlind。{property here}中的每个属性都需要声明它已经进行了分支,并且BlindSet.CurrentBlind属性需要宣布它已更改。