【问题标题】:ComputedVerticalScrollBarVisibility Trigger does not work if using binding/converter如果使用绑定/转换器,ComputedVerticalScrollBarVisibility 触发器不起作用
【发布时间】:2012-07-12 21:25:15
【问题描述】:

这个问题与another SO question of mine 非常相关,但这个问题更具体。请随意前往其他问题了解更多详细信息,但我应该在此处提供您需要的一切。

我已经为我的列表视图实现了一个自定义样式,以便我可以使用以下内容访问滚动条属性(我删除了一些不相关的杂项)

<Style x:Key="{x:Static GridView.GridViewScrollViewerStyleKey}" TargetType="ScrollViewer">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ScrollViewer">
                <Grid Background="{TemplateBinding Background}">
                    <DockPanel Margin="{TemplateBinding Padding}">
                        <ScrollViewer DockPanel.Dock="Top" Focusable="false">   
                    </DockPanel>
                    <ScrollBar Name="PART_HorizontalScrollBar" Orientation="Horizontal"  Grid.Row="1" Maximum="{TemplateBinding ScrollableWidth}" ViewportSize="{TemplateBinding ViewportWidth}" Value="{TemplateBinding HorizontalOffset}" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"/>
                    <ScrollBar Name="PART_VerticalScrollBar" Grid.Column="1" Margin="20,0" Maximum="{TemplateBinding ScrollableHeight}" ViewportSize="{TemplateBinding ViewportHeight}" Value="{TemplateBinding VerticalOffset}" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="ComputedVerticalScrollBarVisibility" Value="Collapsed">
                        <Setter Property="Width">
                            <Setter.Value>
                                <Binding  
                                    ConverterParameter="400" 
                                    RelativeSource="{RelativeSource FindAncestor,AncestorType={x:Type ListView}}"
                             >
                                    <Binding.Converter>
                                        <Converters:ListViewColumnResizeConverter/>
                                    </Binding.Converter>
                                </Binding>
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                    <Trigger Property="ComputedVerticalScrollBarVisibility" Value="Visible">
                        <Setter Property="Width">
                            <Setter.Value>
                                <Binding  
                                    ConverterParameter="500" 
                                    RelativeSource="{RelativeSource FindAncestor,AncestorType={x:Type ListView}}"
                             >
                                    <Binding.Converter>
                                        <Converters:ListViewColumnResizeConverter/>
                                    </Binding.Converter>
                                </Binding>
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

注意我有两个触发器,一个用于Visible,一个用于Collapsed。当我运行我的应用程序时,无论如何我都会得到一个Visible,然后是一个Collapsed。我什至用计时器延迟加载我的数据并且没有触发Visible是我遗漏了什么,还是 Dependency Property 未正确触发的错误?

更新

所以,我注意到它的准系统版本正在工作(不使用绑定和转换器),所以我从我的代码中删除了它并让触发器简单地更新背景颜色。而且,它有效,那么为什么添加绑定/转换器会弄乱触发器?

【问题讨论】:

    标签: c# wpf .net-3.5


    【解决方案1】:

    好吧,答案肯定对我没有帮助,但似乎绑定的值被缓存了。由于我的代码隐藏转换器更像是获得对 Computed 触发器的代码访问权限,因此我什至没有使用返回值。但是,我继续将唯一的颜色值绑定到每个触发器,一旦滚动条变得可见,我的代码就没有再次被击中,而是使用了初始调用的返回值。我必须承认,这对 MS 团队来说是相当聪明的,但对我来说却是一个绊脚石。如果用户具有可用于每个触发器的与时间相关的值怎么办?

    【讨论】:

      猜你喜欢
      • 2011-12-05
      • 2018-03-26
      • 2011-04-16
      • 2017-11-09
      • 1970-01-01
      • 2016-11-09
      • 2018-04-30
      • 2022-11-24
      • 1970-01-01
      相关资源
      最近更新 更多