通过ContentControl绑定到DataTemplate中根元素的属性

时间:2010-10-07 20:57:50

标签: wpf data-binding 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>

实际问题是:如何在“Position”标签的content属性中使用数据绑定从DataTemplate中的Border的AutomationProperties.Name属性中获取单词“Author”?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

到目前为止,解决方案是将TypeName的字符串属性添加到viewmodel,并使用代码隐藏中的AutomationProperties.Name的内容填充它。并使用以下绑定:

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

但是,我仍然认为应该可以在不使用ViewModel的情况下执行此操作,我希望能够在我的数据绑定技能得到改进后重新审视此问题。