【问题标题】:Binding to properties in a custom ControlTemplate绑定到自定义 ControlTemplate 中的属性
【发布时间】:2011-09-08 17:33:24
【问题描述】:

我有一个在单独的资源文件中定义的自定义数据样式网格。在这种风格中,我重写了 ControlTemplate 来改变它的外观。

然后我有自己的 CustomDataGrid 控件,它是从 UserControl 派生的,并使用资源文件中的样式。

我需要能够让垂直滚动条具有用户定义的宽度。我知道如何通过硬编码一个值来改变滚动条的宽度。我不能做的是在我的自定义控件中设置滚动条宽度。

这是我的模板样式在资源文件中的样子,我需要滚动条宽度我有一系列问号。

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGrid}">
                <Border x:Name="border" SnapsToDevicePixels="True" BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" Background="{TemplateBinding RowBackground}">
                    <ScrollViewer x:Name="DG_ScrollViewer" Focusable="false" Background="Black">
                        <ScrollViewer.Template>
                            <ControlTemplate TargetType="{x:Type ScrollViewer}">
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="Auto" />
                                        <ColumnDefinition Width="*" />
                                        <ColumnDefinition Width="Auto" />
                                    </Grid.ColumnDefinitions>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="Auto" />
                                        <RowDefinition Height="*" />
                                        <RowDefinition Height="Auto" />
                                    </Grid.RowDefinitions>
                                    <Button Focusable="false" Command="{x:Static DataGrid.SelectAllCommand}"
                                        Style="{DynamicResource {ComponentResourceKey 
                                        ResourceId=DataGridSelectAllButtonStyle, 
                                        TypeInTargetAssembly={x:Type DataGrid}}}"
                                        Visibility="{Binding HeadersVisibility, 
                                        ConverterParameter={x:Static DataGridHeadersVisibility.All}, 
                                        Converter={x:Static DataGrid.HeadersVisibilityConverter}, 
                                        RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                                        Width="{Binding CellsPanelHorizontalOffset, 
                                        RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
                                    <DataGridColumnHeadersPresenter x:Name="PART_ColumnHeadersPresenter" Grid.Column="1" Height="32"
                                        Visibility="{Binding HeadersVisibility, 
                                        ConverterParameter={x:Static DataGridHeadersVisibility.Column}, 
                                        Converter={x:Static DataGrid.HeadersVisibilityConverter}, 
                                        RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
                                    <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" Grid.ColumnSpan="2"
                                        Grid.Row="1" CanContentScroll="{TemplateBinding CanContentScroll}" />
                                    <ScrollBar x:Name="PART_VerticalScrollBar" Grid.Column="2" Grid.Row="0" Grid.RowSpan="2"
                                        Orientation="Vertical" ViewportSize="{TemplateBinding ViewportHeight}"
                                        Maximum="{TemplateBinding ScrollableHeight}"
                                        Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"
                                        Width="{????????????????????????}"       
                                        Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"/>
                                    <Grid Grid.Column="1" Grid.Row="2">
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="{Binding NonFrozenColumnsViewportHorizontalOffset, 
                                                RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
                                            <ColumnDefinition Width="*" />
                                        </Grid.ColumnDefinitions>
                                        <ScrollBar x:Name="PART_HorizontalScrollBar" Grid.Column="1" Orientation="Horizontal"
                                            ViewportSize="{TemplateBinding ViewportWidth}" Maximum="{TemplateBinding ScrollableWidth}"
                                            Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"
                                            Value="{Binding HorizontalOffset, Mode=OneWay, 
                                            RelativeSource={RelativeSource TemplatedParent}}"/>
                                        </Grid>
                                    </Grid>
                            </ControlTemplate>
                        </ScrollViewer.Template>
                        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

谁能帮帮我?

【问题讨论】:

    标签: wpf binding properties controltemplate


    【解决方案1】:

    创建一个名为(例如)ScrollBarWidth 的依赖属性,然后在模板中写入Width={TemplateBinding ScrollBarWidth}

    【讨论】:

    • 我已经尝试过了,编译时得到以下错误消息:在类型'ScrollViewer'上找不到静态成员'ScrollBarWidthProperty'。
    • 我没有注意到您在嵌套模板中。我认为您需要将 ScrollViewer 的附加属性 TemplateBind 绑定到您的属性,然后 TemplateBind 将宽度绑定到该附加属性。
    • 我不知道这是否正确,但我使用了 Width="{Binding ElementName=CDataGrid, Path=ScrollBarWidth}" 其中 CDataGrid 是我的自定义数据网格的名称,源自用户控件。我在后面的代码中为我的自定义数据网格控件创建了一个 ScrollBarWidthProperty 作为 DependencyProperty。这似乎确实有效。我不知道它有多正确,或者它是否存在潜在问题。
    • 它会起作用,但前提是它具有该名称。您也可以使用FindAncestor 来工作而不使用名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多