ProgressBar未通过绑定更新为最大值

时间:2009-03-17 19:58:30

标签: wpf binding progress-bar

<ProgressBar Foreground="Red"
             Background="Transparent"
             Value="{Binding NumFailed, Mode=OneWay}"
             Minimum="0"
             Maximum="{Binding NumTubes, Mode=OneWay, Converter={x:Static wpftools:DebuggingConverter.Instance}, ConverterParameter=Failedprogressbar}"
             FlowDirection="RightToLeft"
             Style="{DynamicResource {x:Static wpftools:CustomResources.StyleProgressBarVistaKey}}" />

这就是我目前的进度条。样式来自http://mattserbinski.com/blog/look-and-feel-progressbar,DebuggingConverter是一个无操作转换器,它将值,类型和参数输出到控制台。我已经验证,当我的NumTubes属性发生变化时,将调用Maximum的转换器。

基本上,在Value更改之前,ProgressBar不会重绘。因此,如果我有2个管并且1个失败,即使我再添加20个管,该栏仍然是半填充,直到NumFailed更改,然后比例更新。我已经尝试添加NumFailed属性的虚假通知,但由于值没有改变,显然不起作用。

想法?

2 个答案:

答案 0 :(得分:4)

看起来条形图大小是在私有方法ProgressBar.SetProgressBarIndicatorLength中计算的。它仅从OnValueChangedOnTrackSizeChangedOnIsIndeterminateChanged调用。

您可以通过反射调用SetProgressBarIndicatorLength,或者循环其中一个导致它被调用的属性。这是蹩脚的,但看起来ProgressBar的设计看起来不像MaximumMinimum会在中间进行更改。

无论您选择哪种方法,都可以使用DependencyPropertyDescriptor.AddValueChanged找出Maximum属性发生变化的时间:

DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(ProgressBar.MaximumProperty, typeof(ProgressBar)));
if (dpd != null)
{
   dpd.AddValueChanged(myProgressBar, delegate
   {
      // handle Maximum changes here
   });
}

答案 1 :(得分:2)

我无法在此处找到解决方案,但我找到了另一种解决方法。当我更改对象的数据源时,我的进度条不会更新(11个中的11个将更改为10个中的10个并冻结进度条),并且意识到我根本不需要更新最大值。

相反,我在值上使用转换器将其转换为百分比,并将最大值设置为100.结果显示相同,但​​没有更改最大值的错误。

public class CreatureStaminaConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var creature = (CreatureBase.CreatureEntityData) value;
        double max = creature.entityData.MaxStat;
        return creature.CurrentStamina/max*100;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}

 <ProgressBar Name="rpbStamina" Minimum="0" Maximum="100" Value="{Binding entityData, Converter={StaticResource CreatureStaminaConverter}}" />