2010-10-07 2 views
0

В моем пользовательском интерфейсе я иногда хочу помещать заголовки над usercontrols.Привязка к свойству на корневом элементе в DataTemplate через ContentControl

Я хочу объявить эти заголовки в XAML для будущей локализуемости, поэтому я хочу, чтобы они не содержали их в datacontexts.

Может ли привязка данных извлекать их из набора свойств в корневом узле 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?

ответ

0

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

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

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

0

Как о поездке маршрут над объектом данных:

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> 
+0

Спасибо. И я полагаю, что установка TypeName на содержимое AutomationProperties.Name в кодировке? – Guge

+0

Должно быть какое-то место, где установлено Person.TypeName, да. Вообще говоря, мне не нравится codebhind (http://goo.gl/KyTW). Но если вы его используете, да, наверное, это место. – bitbonk

+0

Ваше выражение для привязки для TypeName не работает. – Guge

Смежные вопросы