本文github:https://github.com/kiwiwin/silverlight-demo,文件夹:domain-service-duplex-by-auto-refresh-demo
relativeSource可以用来指定binding的source和binding的target之间的位置关系。
relativeSource的三种模式:
1.Self模式
目标元素应用作此绑定的源。当要将元素的一个属性绑定到同一元素的另一个属性时,上述这点很有用。
<object property="{Binding relativeSource={relativeSource Self} ...}" .../>
2.TemplatedParent模式
在其中应用 ControlTemplate 的控件是此绑定的源。这一点可用来在模板级别应用绑定中的验证错误信息。
<object property="{Binding relativeSource={relativeSource TemplatedParent} ...}" .../>
3.FindAncestor模式
无论何时使用FindAncestor模式,通常会指定AncestorType的值。如果树遍历中存在多义性,可指定一个AncestorLevel。
<object property="{Binding relativeSource="{relativeSource Mode=FindAncestor,AncestorType=typenameString,AncestorLevel=levelint} ...}" .../>
备注:
在绑定中,Source、relativeSource 和 Elementname是相互排斥的。如果已设置这些属性中的一种,则在绑定中设置其他两种属性的任何一种(通过 XAML 或代码)将导致异常。
例:
我们期望datagrID中的template column中的button随着State的改变而改变是否为Enabled,同时对比datagrID外的一个Test button在binding时与datagrID中的button的区别
MainPage.xaml
<UserControl xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" x:Class="binding_to_relative_source.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/Expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWIDth="400"> <GrID x:name="LayoutRoot" Background="White"> <button Content="Change" Click="Changebutton_OnClick" WIDth="300" Height="30" VerticalAlignment="top"/> <button Content="Test" IsEnabled="{Binding State}" WIDth="300" Height="30" VerticalAlignment="top" margin="0,40,0"/> <sdk:DataGrID name="kiwIDataGrID" autoGenerateColumns="False" WIDth="300" Height="200" VerticalAlignment="top" margin="0,80,0"> <sdk:DataGrID.Columns> <sdk:DataGrIDTextColumn Binding="{Binding name}" WIDth="150"/> <sdk:DataGrIDTemplateColumn> <sdk:DataGrIDTemplateColumn.CellTemplate> <DataTemplate> <button Content="Dummy button" IsEnabled="{Binding State,relativeSource={relativeSource AncestorType=UserControl}}"/> </DataTemplate> </sdk:DataGrIDTemplateColumn.CellTemplate> </sdk:DataGrIDTemplateColumn> </sdk:DataGrID.Columns> </sdk:DataGrID> </GrID></UserControl>
MainPage.xaml.cs
public partial class MainPage : UserControl,INotifyPropertyChanged { public bool State { get; set; } public event PropertyChangedEventHandler PropertyChanged; public voID NotifyPropertyChanged(string propertyname) { if (PropertyChanged != null) { PropertyChanged(this,new PropertyChangedEventArgs(propertyname)); } } public MainPage() { InitializeComponent(); DataContext = this; var kiwis = new List<Kiwi>(); kiwis.Add(new Kiwi {name = "a"}); kiwis.Add(new Kiwi {name = "b"}); kiwis.Add(new Kiwi {name = "c"}); kiwis.Add(new Kiwi {name = "d"}); kiwIDataGrID.ItemsSource = kiwis; State = true; } private voID Changebutton_OnClick(object sender,RoutedEventArgs e) { State = !State; NotifyPropertyChanged("State"); } } public class Kiwi { public String name { get; set; } }
运行效果:
Enabled
disable
以上是内存溢出为你收集整理的Silverlight中Binding属性RelativeSource全部内容,希望文章能够帮你解决Silverlight中Binding属性RelativeSource所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)