Привязка к свойству корневого элемента в DataTemplate через ContentControl
В моем пользовательском интерфейсе я иногда хочу поместить заголовки выше usercontrols.
Я хочу объявить эти заголовки в XAML для будущей локализуемости, поэтому я хочу не пускать их в контекст данных.
Может ли привязка данных извлечь их из набора свойств корневого узла usercontrol?
Я свел проблему к следующему примеру кода:
using System.Windows;
namespace WpfApplication12
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Person = new Author { Name = "Guge" };
this.DataContext = this;
}
public object Person { get; set; }
}
public class Author
{
public string Name { get; set; }
}
}
А также:
<Window x:Class="WpfApplication12.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication12"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate DataType="{x:Type local:Author}">
<Border AutomationProperties.Name="Author" BorderThickness="1" BorderBrush="Black">
<Label Content="{Binding Name}"/>
</Border>
</DataTemplate>
</Window.Resources>
<StackPanel>
<Label x:Name="Position" Content="Author"/>
<ContentControl x:Name="presentation" Content="{Binding Person}"/>
</StackPanel>
И практическая проблема заключается в следующем: как я могу использовать привязку данных в свойстве содержимого метки "Положение", чтобы извлечь слово "Автор" из свойства AutomationProperties.Name элемента Border в DataTemplate?
2 ответа
Решение до сих пор состоит в том, чтобы добавить строковое свойство для TypeName в viewmodel и заполнить его содержимым AutomationProperties.Name в коде. И используйте следующую привязку:
<StackPanel>
<Label x:Name="Position" Content="{Binding Person.TypeName}"/>
<ContentControl x:Name="presentation" Content="{Binding Person}"/>
</StackPanel>
Тем не менее, я все еще думаю, что это возможно сделать без использования ViewModel, я надеюсь, что смогу вернуться к этой проблеме, когда мои навыки привязки данных улучшатся.
Как насчет прохождения маршрута по вашему объекту данных:
public class Author
{
public string Name { get; set; }
public string TypeName { get; set; } // might be better in base class Person
}
А также:
<Window.Resources>
<DataTemplate DataType="{x:Type local:Author}">
<Border AutomationProperties.Name="{Binding TypeName}"
BorderThickness="1" BorderBrush="Black">
<Label Content="{Binding Name}"/>
</Border>
</DataTemplate>
</Window.Resources>
<StackPanel>
<Label x:Name="Position" Content="{Binding ElementName=presentation, Path=DataContext.TypeName}"/>
<ContentControl x:Name="presentation" Content="{Binding Person}"/>
</StackPanel>