带有StyleTriggers的AutoHide Progressbar

时间:2011-12-01 20:37:34

标签: wpf xaml data-binding triggers progress-bar

我想使用数据绑定隐藏WPF中的进度条。每当属性为0时,进度条应隐藏:我尝试以下代码

(信息:我当前的datacontext是一个包含整数属性'CurrentIndex'的类)

<ProgressBar Minimum="0" Maximum="100" Value="{Binding CurrentIndex, UpdateSourceTrigger=PropertyChanged}" Visibility="Visible">
    <ProgressBar.Style>
        <Style TargetType="{x:Type ProgressBar}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding CurrentIndex}" Value="0">
                    <Setter Property="Visibility" Value="Hidden"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ProgressBar.Style>
</ProgressBar>

这段代码有什么问题?当CurrentIndex为0时,为什么进度条仍然显示? (在后面的模型中,当加载控件时,'CurrentIndex'的值默认为0)

3 个答案:

答案 0 :(得分:2)

DP precedence,请勿在控件本身上设置Visibility(本地值&gt;样式)。

答案 1 :(得分:0)

使用可见性绑定和转换器的其他方法:

<Grid>
<Grid.Resources>
    <App:VisibilityConverter x:Key="VisibilityConverter" />
</Grid.Resources>
<ProgressBar Minimum="0" Maximum="100" Value="{Binding CurrentIndex, UpdateSourceTrigger=PropertyChanged}" 
             Visibility="{Binding CurrentIndex, Mode=OneWay, Converter={StaticResource VisibilityConverter}}" />
</Grid>

转换器代码(VisibilityConverter.cs):

public class VisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (int)value == 0 ? Visibility.Hidden : Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

答案 2 :(得分:0)

你的XAML几乎是对的!

按照您的方式定义进度条:

<ProgressBar Minimum="0" 
             Maximum="100" 
             Value="{Binding CurrentIndex, UpdateSourceTrigger=PropertyChanged}"
             Name="MyAutoHidingProgressBar" />

不要忘记添加Name属性,并且不要在此处设置Visibility。 它将始终覆盖Style中设置的内容。

然后在Style

中定义<Window.Resources>正常
 <Window.Resources>
    <Style TargetType="ProgressBar" x:Key="MyAutoHidingProgressBarStyle">
       <Style.Triggers>
           <DataTrigger Binding="{Binding ElementName=MyAutoHidingProgressBar, Path=Value}" Value="0">
                <Setter Property="Visibility" Value="Hidden"></Setter>
           </DataTrigger>
       </Style.Triggers>
    </Style>
</Window.Resources>

这基本上是检查进度条本身的值,而不是你的绑定。

最后一步将Style添加到进度条:

Style="{StaticResource MyAutoHidingProgressBarStyle}"

现在,如果ProgressBar Value0,则import java.util.concurrent.atomic.AtomicInteger; public class ScanInProgress { private final Integer scanId; private final int nbScans; private AtomicInteger nbResponses = new AtomicInteger(0); private AtomicInteger nbErrors = new AtomicInteger(0); public ScanInProgress(Integer scanId, int nbSites) { this.scanId = scanId; this.nbScans = nbSites; } public Integer getScanId() { return scanId; } public boolean addSuccess() { addResponse(); return isDone(); } public boolean addError() { addResponse(); nbErrors.incrementAndGet(); return isDone(); } private void addResponse() { nbResponses.incrementAndGet(); } private boolean isDone() { return nbResponses.get() == nbScans; } public int getNbSuccesses() { return nbResponses.get() - nbErrors.get(); } public int getNbResponses() { return nbResponses.get(); } } 会自动隐藏。 您还可以轻松添加触发器,以便在其完整时隐藏它。