RelativeSource 是一個標記擴展,擴展描述相對于綁定目標位置的綁定源位置。
RelativeSource 作用是改變綁定指向的源,默認使用綁定的源是對應的DataContext對象中的屬性,如果想要綁定源為其他元素,比如自身、其他父級控件、其他ViewModel,就需要用RelativeSource 進行標記。它表示在綁定表達式中引用另一個元素的屬性。它使開發人員可以根據元素的位置和類型來查找綁定源。
AncestorLevel | 以 FindAncestor 模式獲取或設置要查找的上級級別。 使用 1 指示最靠近綁定目標元素的項。 |
AncestorType | 指定查找的上級節點的類型。 |
Mode | 獲取或設置 RelativeSourceMode 值,該值描述相對于綁定目標的位置的綁定源的位置。Mode屬性是一個RelativeSourceMode 枚舉 |
PreviousData | 一個靜態值,效果等同于 Mode=PreviousData。該值用于返回為 RelativeSource 模式構造的 PreviousData。 |
Self | 一個靜態值,效果等同于 Mode=Self。該值用于返回為 RelativeSource 模式構造的 Self。 |
TemplatedParent | 一個靜態值,效果等同于 Mode=TemplatedParent。該值用于返回為 RelativeSource 模式構造的 TemplatedParent。 |
RelativeSource屬性有四種模式:
綁定控件本身的屬性
示例:
實現正方形控件(寬和高相等),通過RelativeSource 實現,使用Self將Width綁定到Height上。
Width="{Binding RelativeSource={RelativeSource Self}, Path=Height}"//或者 Width="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Height}"控件的Xaml代碼:
<ButtonWidth="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Height}"Height="100"Margin="40,67,0,0"HorizontalAlignment="Left"VerticalAlignment="Top"Content="Button"/>效果:
只需要修改Height值,Width就會跟著變化
綁定控件父元素及更上一級的元素,使用Mode=FindAncestor和AncestorType 、 AncestorLevel配合實現。
如下幾種定義效果是相同的
RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1, AncestorType=Grid} RelativeSource={RelativeSource AncestorLevel=1, AncestorType=Grid} RelativeSource={RelativeSource AncestorType=Grid}示例:
通過設置一個Button的Width和不同父級布局控件的寬度綁定來演示FindAncestor模式
當前界面代碼:
<Windowx:Class="WpfRelativeSourceExample.MainWindow"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:local="clr-namespace:WpfRelativeSourceExample"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"Title="MainWindow"Width="800"Height="450"mc:Ignorable="d"><Grid><StackPanel Background="LightGray"><GridWidth="768"Height="380"Margin="0,27,0,0"HorizontalAlignment="Left"Background="Gray"><GridWidth="396"Height="344"Margin="0,36,0,0"HorizontalAlignment="Left"VerticalAlignment="Top"Background="Linen"><Canvas Margin="0,53,173,0" Background="DarkCyan" ><ButtonCanvas.Top="56"Height="100"HorizontalAlignment="Center"VerticalAlignment="Top"Content="Button" /></Canvas></Grid></Grid></StackPanel></Grid> </Window>將Button的Width設置和Canvas一樣,增加下面的綁定
Width="{Binding Width, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Canvas}}"此時并未生效
因為規則4中說明對應Canvas未定義,對應的Width屬性,所有無法生效,只要對應Canvas設置了Width屬性,RelativeSource就生效了。
然后依次跟上面兩級的Grid的綁定
第一級:
<ButtonCanvas.Top="56"Width="{Binding Width, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid}}"Height="100"HorizontalAlignment="Center"VerticalAlignment="Top"Content="Button" />//等效 <ButtonCanvas.Top="56"Width="{Binding Width, RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1, AncestorType=Grid}}"Height="100"HorizontalAlignment="Center"VerticalAlignment="Top"Content="Button" />第二級:
<ButtonCanvas.Top="56"Width="{Binding Width, RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=2, AncestorType=Grid}}"Height="100"HorizontalAlignment="Center"VerticalAlignment="Top"Content="Button" />TemplatedParent模式主要用在重寫或者定義控件模板Template中,用于將模板中的屬性和控件本身的屬性綁定,類似TemplateBinding,可以對TemplateBinding進行擴展,利用Converter實現一些TemplateBinding不支持的屬性綁定
示例:
<ButtonMargin="49,60,0,0"Padding="10"HorizontalAlignment="Left"VerticalAlignment="Top"Content="Button"><Button.Style><Style TargetType="Button"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Border Background="{TemplateBinding Background}"><ContentPresenter Margin="{Binding Path=Padding, RelativeSource={RelativeSource TemplatedParent}}" Content="{TemplateBinding Content}" /></Border></ControlTemplate></Setter.Value></Setter></Style></Button.Style></Button>PreviousData可以在數據綁定表達式中使用前一個數據項。通常在ItemsControl中使用,用于根據前一個項的屬性計算當前項的屬性。PreviousData只能在ItemsControl或其派生類中使用。
使用場景,暫無示例
使用RelativeSource改變綁定的ViewModel對象。在嵌套的ViewModel中,命令一定要寫在對應的VIewModel(或者Model)中才能實現綁定,這時可以通過RelativeSource綁定到其父級的ViewModel中的命令上。
比如在DataGrid列中有按鈕事件,就必須對應的命令需要寫在對應的Model中增加命令
正常下一個DataGird(在用戶控件UserManageUC.xaml中)
<DataGridWidth="605"Height="341"Margin="59,74,0,0"HorizontalAlignment="Left"VerticalAlignment="Top"AutoGenerateColumns="False"ItemsSource="{Binding Users}"><DataGrid.Columns><DataGridTextColumn Binding="{Binding Id}" Header="序號" /><DataGridTextColumn Binding="{Binding Name}" Header="姓名" /><DataGridTextColumn Binding="{Binding Age}" Header="年齡" /><DataGridTemplateColumn Header="操作"><DataGridTemplateColumn.CellTemplate><DataTemplate><StackPanel Orientation="Horizontal"><Button Command="{Binding ModifyCmd}" Content="修改" /><Button Content="刪除" /></StackPanel></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn></DataGrid.Columns></DataGrid>對應的數據模型UserModel
public class UserModel{public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }public CommandBase ModifyCmd{get{return new CommandBase(o =>{MessageBox.Show($"UserModel Modify:{Name}");});}}} }在對應的ViewModel創建集合并初始化
public class UserManageUCViewModel : ViewModelBase{public ObservableCollection<UserModel> Users{ get; set; }public UserManageUCViewModel(){Users= new ObservableCollection<UserModel>();Users.Add(new UserModel() { Id=1,Name="張三",Age=11});Users.Add(new UserModel() { Id=2,Name="李四",Age=22});}}此時效果,正常使用命令
在UserManageUCViewModel 上添加命令
public CommandBase ModifyCmd {get{return new CommandBase(o =>{var user=o as UserModel;MessageBox.Show($"UserManageUCViewModel Modify:{user.Name}");});} }改變按鈕Command的綁定,使用RelativeSource的FindAncestor模式RelativeSource={RelativeSource AncestorType=local:UserManageUC}幫綁定對象改為UserManageUC用戶控件,然后目標改為DataContext.ModifyCmd,然后增加CommandParameter,將該行綁定的數據作為命令參數傳入
<ButtonCommand="{Binding DataContext.ModifyCmd, RelativeSource={RelativeSource AncestorType=local:UserManageUC}}"CommandParameter="{Binding}"Content="修改" />效果:
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
vivox60處理器和參數?vivoX60處理器均搭載了Exynos1080旗艦芯片,5nm制程。應該是超過驍龍865。Exynos1080的板載顯卡調制解調器能提高了直接下載內容的速度,按結構了Cortex-A78CPU、Mali-78GPU的配置,產品參數1、vivoX60有三色可選,厚7、36mm,寬73、24mm,常規緞面材質AG玻璃工藝。2、vivoX60區分了三星Exynos1080處...
奔騰電磁爐質量怎么樣?質量好。這款電磁爐的賣點是黑晶面板4D防水抑噪非常出色,做工和細節設計都非常出色。功率2100w,9檔火力調節,定時功能,標配湯鍋煎鍋。八檔火力,觸控面板,定時功能,內部防水墻設計,變頻風扇對噪音抑制很有幫助。雖然介紹中沒有注明線圈尺寸,但是這個價格大概率在150mm左右。奔騰電器質量咋樣?打算買奔騰電磁爐?奔騰電器質量還可以。我家里用的是奔騰電磁爐。一般來說,電磁爐可以用2...
怎樣將ansys中文版換成英文版?在設置中找到語言設置,切換到英語確認即可。ansys19.2怎么漢化?因為沒有中文版,所以無法調整中文版。ansys18.1英文版怎么改中文?下載后再連接中文版就行了。沒有我附加的操作。ansys為什么不出中文版?有中文版,但是你可以 不要用經典的ansys,應該用ansys workbench。界面非常友好,3d界面非常豐富,項目界面可以輕松處理多場耦合。ans...