Wpf ProgressBar在通过绑定更改为最大值时未更新

Wpf ProgressBar在通过绑定更改为最大值时未更新,wpf,binding,progress-bar,Wpf,Binding,Progress Bar,这就是我的progressbar目前的样子。该样式来自DebuggingConverter,它是一个无操作转换器,将值、类型和参数打印到控制台。我已验证在更改NumTubes属性时是否正在调用最大值转换器 基本上,ProgressBar在值更改之前不会重新绘制。因此,如果我有2个管,1个管失败,即使我再添加20个管,该条仍为半填充,直到NumFailed发生更改,然后更新比例。我曾尝试添加NumFailed属性的虚假通知,但由于该值没有更改,因此显然不起作用 想法?看起来条形图的大小是在私有方法

这就是我的progressbar目前的样子。该样式来自DebuggingConverter,它是一个无操作转换器,将值、类型和参数打印到控制台。我已验证在更改NumTubes属性时是否正在调用最大值转换器

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


想法?

看起来条形图的大小是在私有方法
ProgressBar.setprogressbarindicator长度中计算的。它仅从
OnValueChanged
OnTrackSizeChanged
onInDefiniteChanged
调用

您可以通过反射调用
setProgressBarIndicator或Length
,或者循环导致调用它的一个属性。这是很蹩脚的,但它看起来不像
ProgressBar
的设计是为了在进程中更改
最大值和
最小值

无论选择哪种方法,您都可以通过以下方法确定
Maximum
属性何时更改:


我很难在这里找到解决方案,但我找到了另一个解决方案。我的进度条不会更新,因为我更改了对象的数据源(11/11将更改为10/10并冻结进度条),并且意识到我根本不需要更新最大值

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

DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(ProgressBar.MaximumProperty, typeof(ProgressBar)));
if (dpd != null)
{
   dpd.AddValueChanged(myProgressBar, delegate
   {
      // handle Maximum changes here
   });
}
公共类CreatureStaminaConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
var生物=(CreatureBase.CreatureEntityData)值;
双倍最大值=bioter.entityData.MaxStat;
返回生物。当前耐力/最大*100;
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
返回null;
}
}

我可以做一个简单的子类来触发它吗?你认为呢?实际上,你不需要子类,你可以为MaximumProperty获取DependencyPropertyDescriptor并调用AddValueChanged。我会将此添加到我的帖子中。谢谢,我在委托中切换了IsIndestime true/false。工作很好。我喜欢它,很好的结束运行周围的行为。
DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(ProgressBar.MaximumProperty, typeof(ProgressBar)));
if (dpd != null)
{
   dpd.AddValueChanged(myProgressBar, delegate
   {
      // handle Maximum changes here
   });
}
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}}" />