Day*_*man 4 wpf relativesource findancestor
我有一个绑定到对象的ItemsControl,在ItemsControl的数据模板中,我有两个文本块,我想将第一个文本块的text属性绑定到位于此ItemsControl之外的另一个文本块。
我尝试在父datacontext中查找对象,也尝试使用Path = Text查找TextBlock
下面是一个示例:
<TextBlock Name="Name" Text="{Binding Name}"
Grid.Column="0"
FontSize="{DynamicResource SmallSize}"
TextWrapping="Wrap"
TextAlignment="Right"
Padding="4,0,0,0"
Grid.ColumnSpan="2" Background="Aqua"/>
<ItemsControl ItemsSource="{Binding TheValue}"
Padding="4,0,0,0"
Grid.Column="2"
HorizontalAlignment="Right">
<ItemsControl.ItemTemplate>
<DataTemplate>
<WrapPanel>
<TextBlock Text = "{
Binding RelativeSource =
{RelativeSource FindAncestor,
AncestorType={x:Type Window}}, Path=Name}"
Grid.Column="0"
FontSize="{DynamicResource SmallSize}"
TextWrapping="Wrap" ........................
Run Code Online (Sandbox Code Playgroud)
{Binding RelativeSource = {RelativeSource FindAncestor,
AncestorType={x:Type Window}}, Path=Name}
Run Code Online (Sandbox Code Playgroud)
在这里,您对WPF说,使用Type Window查找该控件的第一个父级,例如“ ParentWindow”。此绑定发生到“ ParentWindow”名称属性之后。
如果要启用在同一XAML中定义的控件绑定,则可以使用Binding.ElementName属性显式设置源。这是您的代码示例:
<TextBlock Text = "{Binding ElementName=Name, Path=Text}"/>
Run Code Online (Sandbox Code Playgroud)
顺便说一句,将控件名称用作“名称”不是很好。如果在后面使用此控件表单代码,则其名称为Name.Text =“ some text”,这可能会导致难以理解发生的情况。
更新: 在不同数据模板中绑定以控制DataContext属性的示例
class MainViewModel
{
public Class1 C1 { get; set; }
public Class2 C2 { get; set; }
public MainViewModel()
{
C1 = new Class1 { S1 = "This is C1 data context" };
C2 = new Class2 { S2 = "This is C2 data context" };
}
}
Run Code Online (Sandbox Code Playgroud)
在XAML中:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate DataType="{x:Type local:MainViewModel}">
<StackPanel>
<ContentControl Name="cc1" Content="{Binding C1}"/>
<ContentControl Name="cc2" Content="{Binding C2}"/>
</StackPanel>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Class1}">
<TextBlock Text="{Binding S1}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Class2}">
<TextBlock Text="{Binding ElementName=cc1, Path=DataContext.C1.S1}"/>
</DataTemplate>
</Window.Resources>
<Grid>
<ContentControl Content="{Binding}"/>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
但是,我认为这样的方法不是一个好方法。特别是因为此DataTemplate可能有很多项。也许您需要将此委托给ViewModel。