Привязка к свойству корневого элемента в DataTemplate через ContentControl - PullRequest
0 голосов
/ 08 октября 2010

В моем пользовательском интерфейсе я иногда хочу поместить заголовки выше 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 границы в DataTemplate?

Ответы [ 2 ]

0 голосов
/ 23 октября 2010

Решение до сих пор состоит в том, чтобы добавить строковое свойство для TypeName в viewmodel и заполнить его содержимым AutomationProperties.Name в коде. И используйте следующую привязку:

<StackPanel>
    <Label x:Name="Position" Content="{Binding Person.TypeName}"/>
    <ContentControl x:Name="presentation" Content="{Binding Person}"/>
</StackPanel>

Тем не менее, я все еще думаю, что это возможно сделать без использования ViewModel, я надеюсь, что смогу вернуться к этой проблеме, когда мои навыки привязки данных улучшатся.

0 голосов
/ 08 октября 2010

Как насчет прохождения маршрута по вашему объекту данных:

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>
...