Использование FindAncestor из таблички данных Itemscontrol для поиска текстового блока вне таблички данных
У меня есть ItemsControl, который привязан к объекту, в пределах таблицы данных ItemsControl у меня есть два текстовых блока, я хочу связать свойство текста первого текстового блока с другим текстовым блоком, который находится вне этого ItemsControl.
Я пытался найти объект в родительском текстовом данных, а также просто пытался найти TextBlock с Path=Text
один пример ниже:
<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" ........................
1 ответ
{Binding RelativeSource = {RelativeSource FindAncestor,
AncestorType={x:Type Window}}, Path=Name}
Здесь вы говорите WPF найти первого родителя этого элемента управления с помощью Type Window, например, это "ParentWindow". После этого привязка происходит к свойству Name "ParentWindow".
Если вы хотите включить привязку к элементу управления, который определен в том же XAML, вы можете явно указать источник, используя свойство Binding.ElementName. Это пример для вашего кода:
<TextBlock Text = "{Binding ElementName=Name, Path=Text}"/>
Кстати, использование контрольного имени в качестве "имени" не хорошо. Если вы используете этот код формы управления позади, он выглядит как Name.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" };
}
}
В 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>
Но я не думаю, что подобное является хорошим подходом. Особенно, потому что это может быть много элементов с этим DataTemplate. Может быть, вам нужно делегировать это вашей ViewModel.