代码之家  ›  专栏  ›  技术社区  ›  Rodney

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

  •  3
  • Rodney  · 技术社区  · 14 年前

    我有一个绑定到2个整数值的进度条-一个是总秒数,另一个是剩余秒数(在计时器上倒计时:总是<=总秒数)。

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

    这让我很困惑,所以我把它简化为:

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

    要么我做了一些非常愚蠢的事情(可能;)或者是进度条控件中的错误。

    <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秒)。

    当我绑定到一个具有相同值的新BlindSet对象(即1200秒)时,它会按预期工作-所以我想我需要以某种方式让它重新计算大小值的变化-知道怎么做吗?!

    2 回复  |  直到 14 年前
        1
  •  2
  •   Bertrand Marron    14 年前

    我刚刚在一篇文章的评论部分读到了这个 blog article ,希望对你有帮助。

    让大家都知道。ProgressBar(至少在2009年9月3日的Silverlight中)不能很好地处理数据绑定。它只能部分起作用。因此,您可能希望在设计中考虑到这一点,直到它被修复为止。

    2) 可见性无法数据绑定(您可以尝试,但它总是像您设置了Mode=OneTime一样工作)
    3) 其他绑定似乎也不总是稳定的。。。
    希望这能帮助人们避免沮丧。

        2
  •  0
  •   Richard B    14 年前

    好吧,假设您在对象上实现INotifyPropertyChanged,您必须声明“public Blindset Blindset”和“Blindset”实例上的每个属性都在更改。。。我说的对吗?你还需要使用双向绑定,还是我在考虑输入值?


    更清楚的说。。。BlindSet.currentbind.{property here}上的每个属性都需要宣布它也发生了变化,BlindSet.currentbind属性需要宣布它发生了变化。