绑定到 wpf 中父元素的属性

Posted

技术标签:

【中文标题】绑定到 wpf 中父元素的属性【英文标题】:Bind to a property of a parent element in wpf 【发布时间】:2011-01-27 05:32:12 【问题描述】:

'我想将 RichTextBox 的 Height 属性绑定到 GridView 的 Row 的 Height 属性。我怎样才能做到这一点?我不知道如何获取行的高度,因为我无法在 xaml 中访问我想做的行。

Ancestor 类型应该是 GridViewHeaderRow ,但我不知道它的级别...

编辑:

 <my:RadGridView  Height="524" RowHeight="300" ItemsSource="Binding Lessons" AutoGenerateColumns="False" Name="dataGrid1" VerticalAlignment="Top" SelectionMode="Single" CanUserSortColumns="False" IsFilteringAllowed="False">

            <my:RadGridView.Columns>
                <my:GridViewDataColumn  DataMemberBinding="Binding SchoolclassName" Header="Schoolclass" Width="0.1*" />
                <my:GridViewDataColumn DataMemberBinding="Binding SubjectName"     Header="Subject"      Width="0.1*" />

                <my:GridViewDataColumn  Width="0.3*" Header="Homework">
                    <my:GridViewDataColumn.CellTemplate>
                        <DataTemplate>
                            <RichTextBox Height="Binding ElementName=dataGrid1,Path=RowHeight" >
                                <FlowDocument>
                                    <Paragraph>
                                        <Run Text="Binding Homework"/>
                                    </Paragraph>
                                </FlowDocument>
                            </RichTextBox>                                
                        </DataTemplate>
                    </my:GridViewDataColumn.CellTemplate>


<my:RadGridView Height="524" ItemsSource="Binding Lessons" AutoGenerateColumns="False" Name="dataGrid1" VerticalAlignment="Top" SelectionMode="Single" CanUserSortColumns="False" IsFilteringAllowed="False">
            <my:RadGridView.Columns>

                <my:GridViewDataColumn Name="ContentColumn" Width="0.3*" Header="Content">
                    <my:GridViewDataColumn.CellTemplate>
                        <DataTemplate>
                            <RichTextBox Height="Binding ElementName=MyRowNameToBindTo,Path=Height">
                                <FlowDocument>
                                    <Paragraph>
                                        <Run Text="Binding Content"/>
                                    </Paragraph>
                                </FlowDocument>
                            </RichTextBox>
                        </DataTemplate>
                    </my:GridViewDataColumn.CellTemplate>

...

【问题讨论】:

【参考方案1】:

我不了解您的 RadGridView。但我要尝试的第一件事是使用 RelativeSource Binding 和 FindAncestor 沿着可视化树向上走,直到找到 GridViewHeaderRow 并绑定到它的 Height 属性。

... Height="绑定高度, RelativeSource=RelativeSource 模式=FindAncestor, AncestorType=x:Type GridViewHeaderRow " ...

您可能必须沿着树向上走才能找到 RadGridView,然后再向下走回到标题行。

... Height="绑定 HeaderRow.Height, RelativeSource=RelativeSource 模式=FindAncestor, AncestorType=x:Type RadGridView " ...

... Height="绑定行[0].Height, RelativeSource=RelativeSource 模式=FindAncestor, AncestorType=x:Type RadGridView " ...

取决于 RadGridView 的实现。

【讨论】:

我已经用更新的代码更改/编辑了 init 问题:为什么我会收到错误: 我忘了,那个 RadGridView有一个 RowHeight 属性,我可以通过 ElementName 绑定... 为什么会出现这个错误? System.Windows.Data 错误:4:找不到与引用“ElementName = dataGrid1”进行绑定的源。绑定表达式:路径=行高度;数据项=空;目标元素是'RichTextBox'(名称='');目标属性是“高度”(类型“双”) 好吧,还有一个理由讨厌 Teleriks 蹩脚的数据网格。公共双行高get; set; 它没有依赖属性...:S 您的 RadGridView 可能没有 NameScope,因此遇到了与此处讨论的相同问题 - joshsmithonwpf.wordpress.com/2008/07/22/…。 现在控制住自己:在本机 DataGrid 中使用它 有效! :P 似乎这一次 MS 做了他们的功课,虽然这很特别 XD

以上是关于绑定到 wpf 中父元素的属性的主要内容,如果未能解决你的问题,请参考以下文章

js中父元素如何获得元素的子元素么

WPF学习第二十九章 元素绑定——将元素绑定到一起

我需要导航到另一个视图,其中包含带有 MVVM 的 WPF 中父对象的子对象

WPF学习第三十章 元素绑定——绑定到非元素对象

WPF学习第三十章 元素绑定——绑定到非元素对象

WPF:元素绑定