在XAML里绑定 ElementName RelativeSource 属性

本文介绍了WPF中两种主要的数据绑定方法:通过调用SetBinding实例方法和使用BindingOperations类的SetBinding静态方法。此外还讲解了如何清除绑定以及使用RelativeSource属性来指定数据源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

在程序代码里,有两种设置绑定的方法,一种是调用FrameworkElement或FrameContentElement对象的SetBinding实例方法。

例如:

InitializeCompnet();
Binding binding = new Binding();
//设置源对象
binding.Source = treeview;
//设置源属性
binding.Path = new PropertyPath("SelectedItem.Header");
//设置目标属性
currentFolder.SetBinding(TextBlock.TextProperty, binding);

另一种是调用BindingOperations类的SetBingding静态方法。可以向这个静态方法传递与上面实例方法相同的对象,但是他的第一个参数表示目标对象。

例如:BindingOperations.SetBinding(currentFolder, TextBlock.TextProperty, binding);

静态方法的好处是,第一个参数是一个DependencyObject对象,他支持对那些不是从FrameworkElement或FrameContentElement对象继承而来的对象(如Freeable对象)进行数据绑定。

如果一个绑定在剩下的应用程序生命周期中已经没有用了,可以在任何时候通过BindingOperations.ClearBinding断开该绑定,要做的就是传入一个目标对象和它的依赖属性。例如:BindingOperations.ClearBinding(currentFolder, TextBlock.TextProperty);

BindingOperations.ClearAllBindings方法是移除所有的绑定。

例如:BindingOperations.ClearAllBindings(currentFolder);

另一种清除绑定的方法是直接为目标属性设置一个新的值。

例如:currentFolder.Text = "I am no longer receiving updates.";

需要注意的是,这仅是清除单向绑定。ClearBinding方法相对而言更加灵活,因为它仍然允许依赖属性以较低的优先级从源那里(如样式触发器、属性值继承等)获得值。

实际上ClearBinding内部调用的都是目标对象的ClearValue方法清除一个本地值。

Binding除了默认构造函数外,还有一个可以传入Path的构造函数,下面两种方式实现的功能是一样的。

<TextBlock x:Name="currentFolder" DockPanel.Dock="Top"

                    Text="{Binding ElementName=treeView, Path=SelectedItem.Header}"

                    Backgroud="AliceBlue" FontSize="16" />

<TextBlock x:Name="currentFolder" DockPanel.Dock="Top"

                    Text="{Binding SelectedItem.Header, ElementName=treeView}"

                    Backgroud="AliceBlue" FontSize="16" />

 

这里使用ElementName来设置源对象,而没有使用Source属性来设置,这两种设置都是有效地,但在XAML里ElementName使用起来更方便,只需要给源元素一个名称就可以了,但如果要设置Source属性,目标对象必须被定义为某个ResourceDictionary中的资源,比如:

<TextBlock x:Name="currentFolder" DockPanel.Dock="Top"

                    Text="{Binding Source={StaticResource treeView}, Path=SelectedItem.Header}"

                    Backgroud="AliceBlue" FontSize="16" />

 

另一种指定数据源的方式是使用Binding的RelativeSource 属性,它通过与目标元素的关系获得相应的元素。RelativeSource的类型是RelativeSource,是一个标记扩展,有一下几种使用的方式:

1. 使源元素为目标元素本身

{Binding RelativeSource={RelativeSource self}}

2. 使源元素为目标元素的TemplatedParent属性

{Binding RelativeSource={RelativeSource TemplatedParent}}

3. 使源元素为最近的指定类型的父元素

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type desiredType}}}

4. 使源元素为n层最近的指定类型的父元素

{Binding RelativeSource={RelativeSource FindAncestor, AncestorLevel=n, AncestorType={x:Type desiredType}}}

5. 使源元素为之前的数据绑定集合中的数据项

{Binding RelativeSource={RelativeSource PreviousData}}

 

在RelativeSource 中使用Self是很方便的,因为这种模式可以把该元素的一个属性绑定到另一个属性上,但却不需要为元素指定名称,比如下面这个例子,Slider的ToolTip绑定了它自己的值:

<Slider ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=Value}">

来源:http://blog.youkuaiyun.com/cs_oldhorse/article/details/6804567

转载于:https://www.cnblogs.com/whpepsi/archive/2013/06/07/3123950.html

XAML(eXtensible Application Markup Language)中,数据绑定是非常常见的一项功能,尤其在Windows Presentation Foundation (WPF) 和UWP应用中。要实现数据绑定的嵌套,你需要确保两个方向的数据流清晰:从视图模型到视图,以及可能存在的双向数据流。 1. **单向数据绑定**:通常用于简单的父子元素之间的关系。例如,如果你有一个包含子列表的主列表,你可以为子列表项设置数据模板并绑定到父级的ItemsSource属性: ```xml <ListView ItemsSource="{Binding ChildList}"> <ListView.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding SomeProperty, Source={RelativeSource AncestorType=ListBoxItem}}"/> </DataTemplate> </ListView.ItemTemplate> </ListView> ``` 这,`{Binding}` 是一个语法糖,它会查找上下文中的属性或依赖项,`Source` 属性用来指定查找范围。 2. **双向数据绑定(Two-Way Binding)**:当需要修改源值时更新目标值时,可以使用 `{Binding Path=..., Mode=TwoWay}`。例如,如果你有一个文本框和一个值类型属性关联,当文本框的内容改变时,属性也会相应更新: ```xml <TextBox Text="{Binding MyProperty, Mode=TwoWay}"/> ``` 3. **嵌套数据绑定**:如果需要在一个控件内的数据绑定引用另一个控件的数据绑定,可以通过相对路径 `RelativeSource` 或绝对路径 `ElementName` 来实现。例如,假设有一个包含多个文本框的面板,每个文本框都绑定到同一个集合中的不同元素: ```xml <StackPanel> <TextBox Name="txtChild1" Text="{Binding FirstItem, ElementName=ParentPanel, Mode=TwoWay}" /> <TextBox Name="txtChild2" Text="{Binding SecondItem, ElementName=ParentPanel, Mode=TwoWay}" /> </StackPanel> ``` 在这,`ElementName` 指定了包含这些文本框的容器(`ParentPanel`),这样就可以在它们之间进行数据交换了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值