【问题标题】:RadGridView Bind Column Width to Another Column?RadGridView 将列宽绑定到另一列?
【发布时间】:2018-09-13 00:31:15
【问题描述】:

我有一个 RadGridView (Telerik),它有几列。在行详细信息模板中,我有另一个网格视图显示具有相同列的子项。这对于初始显示非常有用,但我希望详细信息模板的列宽遵循主网格的宽度(详细信息模板没有标题)。

我尝试为主列命名并按名称绑定到该列的“Width”和“ActualWidth”属性,但它似乎没有采用,也没有给出任何绑定错误。

有没有办法将一个 RadGridView 上的列宽绑定到另一个 RadGridView 上的列宽?

编辑

根据下面的建议,我尝试将视图绑定到标记并按此方式进行,但它似乎不起作用。它适用于文本块,但不设置列宽。这是我看到的视频:

https://www.screencast.com/t/BiHmiarQExV

这是我正在使用的代码:

    <telerik:RadGridView Grid.Row="2" ItemsSource="{Binding RenumberNotes}" x:Name="tgr" AutoGenerateColumns="False"
                         RowDetailsVisibilityMode="Visible">
        <telerik:RadGridView.Columns>
            <telerik:GridViewDataColumn UniqueName="columnName" DataMemberBinding="{Binding CurrentValue}" Width="100" />
        </telerik:RadGridView.Columns>
        <telerik:RadGridView.RowStyle>
            <Style TargetType="telerik:GridViewRow" BasedOn="{StaticResource {x:Type telerik:GridViewRow}}">
                <Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource AncestorType=telerik:RadGridView}}" />
            </Style>
        </telerik:RadGridView.RowStyle>
        <telerik:RadGridView.RowDetailsTemplate>
            <DataTemplate>
                <StackPanel>
                    <StackPanel Orientation="Horizontal" Margin="10,10,10,10">
                        <TextBlock Text="Column width: " />
                        <TextBlock
                            Text="{Binding Tag.Columns[columnName].ActualWidth, RelativeSource={RelativeSource AncestorType=telerik:GridViewRow}}" />
                    </StackPanel>
                    <telerik:RadGridView AutoGenerateColumns="False" ItemsSource="{Binding Subnotes}">
                        <telerik:RadGridView.Columns>
                            <telerik:GridViewColumn Header="test" Width="{Binding Tag.Columns[columnName].ActualWidth, RelativeSource={RelativeSource AncestorType=telerik:GridViewRow}}" />
                        </telerik:RadGridView.Columns>

                    </telerik:RadGridView>
                </StackPanel>
            </DataTemplate>
        </telerik:RadGridView.RowDetailsTemplate>
    </telerik:RadGridView>

如您所见,它正确更新了文本块,因此绑定正确,但未更新列宽。

【问题讨论】:

  • 您可以尝试在要控制宽度的列的标题中放置一个矩形。命名它。将另一个列宽绑定到该矩形的实际宽度。我没有 Telerik 控件可供试验。
  • 起初认为这是潜在的天才,但不幸的是似乎没有奏效。我可以创建矩形并正确观察大小变化,但其他网格视图不会更新。似乎该列由于某种原因无法识别绑定...
  • 我猜它在不同的命名空间中。

标签: wpf user-interface data-binding telerik-grid radgridview


【解决方案1】:

有没有办法将一个RadGridView 上的列宽绑定到另一个RadGridView 上的列宽?

是的。您可以定义一个RowStyle,将GridViewRow 的Tag 属性绑定到父RadGridView,然后使用该属性绑定到网格的Columns 集合。下面是一个例子:

<telerik:RadGridView x:Name="tgr" AutoGenerateColumns="False" RowDetailsVisibilityMode="VisibleWhenSelected">
    <telerik:RadGridView.Columns>
        <telerik:GridViewDataColumn UniqueName="columnName" DataMemberBinding="{Binding Name}" Width="100" />
    </telerik:RadGridView.Columns>
    <telerik:RadGridView.RowStyle>
        <Style TargetType="telerik:GridViewRow" BasedOn="{StaticResource {x:Type telerik:GridViewRow}}">
            <Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource AncestorType=telerik:RadGridView}}" />
        </Style>
    </telerik:RadGridView.RowStyle>
    <telerik:RadGridView.RowDetailsTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Margin="10,10,10,10">
                <TextBlock Text="Column width: " />
                <TextBlock Text="{Binding Tag.Columns[columnName].ActualWidth, RelativeSource={RelativeSource AncestorType=telerik:GridViewRow}}" />
            </StackPanel>
        </DataTemplate>
    </telerik:RadGridView.RowDetailsTemplate>
</telerik:RadGridView>

编辑:

正如您所展示的,它适用于Textblock,但以相同的方式绑定列宽似乎没有任何作用。

对,那是因为列本身不是可视化树的一部分。然后,您将不得不编写一些代码。您可以简单地处理内部RadGridView 的Loaded 事件:

private void RadGridView_Loaded(object sender, RoutedEventArgs e)
{
    RadGridView subGridView = (RadGridView)sender;
    subGridView.Columns[0].Width = columnName.Width;
}

XAML:

<telerik:RadGridView Grid.Row="2" ItemsSource="{Binding RenumberNotes}" x:Name="tgr" AutoGenerateColumns="False"
                     RowDetailsVisibilityMode="Visible">
    <telerik:RadGridView.Columns>
        <telerik:GridViewDataColumn x:Name="columnName" DataMemberBinding="{Binding CurrentValue}" Width="100" />
    </telerik:RadGridView.Columns>
    <telerik:RadGridView.RowDetailsTemplate>
        <DataTemplate>
            <telerik:RadGridView AutoGenerateColumns="False" ItemsSource="{Binding Subnotes}" 
                                             Loaded="RadGridView_Loaded">
                <telerik:RadGridView.Columns>
                    <telerik:GridViewColumn Header="test" />
                </telerik:RadGridView.Columns>
            </telerik:RadGridView>
        </DataTemplate>
    </telerik:RadGridView.RowDetailsTemplate>
</telerik:RadGridView>

这样更干净,不会破坏任何模式。

【讨论】:

  • 我在尝试此操作的基础上添加了更多信息。如您所示,它适用于 Textblock,但以相同的方式绑定列宽似乎没有任何作用。
  • 好的,只需稍作修改即可。按照初始大小的说明工作,但是我希望列大小随着主列的变化而变化。为了做到这一点,我必须在主网格视图上订阅“ColumnWidthChanged”事件,然后遍历详细信息 RGV 并更新列宽以匹配新大小。不幸的是,这并不能提供平滑的尺寸,而是在您完成操作时“跳跃”,但这并不可怕。
  • 刮掉最后一部分,如果您订阅 'ColumnWidthChangING' 而不是 'ColumnWidthChangED' 它很顺利。我知道我可以编辑评论,但以这种方式留给其他出现并且一开始并没有注意到细微差别的人......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
  • 2012-06-02
  • 1970-01-01
相关资源
最近更新 更多