我有一个限制为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对象时,它会按预期工作 - 所以我想我需要以某种方式给它一个重新计算小或大值变化的一脚 - 任何想法如何?!
答案 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属性需要宣布它已更改。