绑定到边界子项的属性

时间:2012-06-21 07:14:23

标签: wpf binding dependency-properties

我已经实现了我自己的导航窗口的简单版本,主要是因为导航窗口日志不能让我控制可以存在多少个孩子。所以我在窗口内使用边框并且每次都要改变它的孩子。作为孩子我正在使用UserControl。我想将我的Window的标题绑定到我当前孩子的Title属性。不知怎的,我无法想办法做到这一点。

MainWindow XAML:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="525"
    Height="350"
    Background="AliceBlue"
    Title="{Binding Path=Child.Title,
                    ElementName=borderContent}">
<DockPanel>
    <StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
        <Button Content="&lt;-" x:Name="btnBack"  />
        <Button Content="->" x:Name="btnForward"  />
    </StackPanel>
    <StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal">
        <Button Content="1" Click="Button_Click_1" />
        <Button Content="2" Click="Button_Click_2" />
    </StackPanel>
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
        <Border x:Name="borderContent"  />
    </ScrollViewer>
</DockPanel>

MainWindow Code背后:

using System;
using System.Windows;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            this.borderContent.Child = new ContentPage("Title 1");
        }

        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            this.borderContent.Child = new ContentPage("TITLE 2");
        }
    }
}

UserControl XAML:

<UserControl x:Class="WpfApplication1.ContentPage"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <TextBlock Text="{Binding Source={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Path=Title}" />
</Grid>

用户控制代码背后:

using System.Windows;
using System.Windows.Controls;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for Content.xaml
    /// </summary>
    public partial class ContentPage : UserControl
    {
        public string Title
        {
            get { return (string)this.GetValue(ContentPage.TitleProperty); }
            set { this.SetValue(ContentPage.TitleProperty, value); }
        }

        // Using a DependencyProperty as the backing store for Title.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TitleProperty =
            DependencyProperty.Register("Title", typeof(string), typeof(ContentPage), new UIPropertyMetadata(string.Empty));

        public ContentPage(string Title)
        {
            this.Title = Title;
            InitializeComponent();

        }
    }
}

UserControl内部的绑定也无法正常工作。我做错了什么?

2 个答案:

答案 0 :(得分:1)

问题是Child的{​​{1}}属性不是Border,因此没有更改通知。每次更改DependencyProperty

时,您都必须手动更新Binding
Child

答案 1 :(得分:0)

我不确定你为什么要做你正在做的事情,但关于你的问题:

将“Source”更改为“RelativeSource”

<Grid>
    <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Path=Title}" />
</Grid>

那应该解决绑定问题

修改

如果您真的想这样做,可以将borderContent元素设置为ContentControl并使用Content属性。由于这是一个DependencyProperty,你的绑定将起作用:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Width="525"
        Height="350"
        Background="AliceBlue"
        Title="{Binding Content.Title, ElementName=borderContent}">
  <DockPanel>
    <StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
      <Button Content="&lt;-" x:Name="btnBack"  />
      <Button Content="->" x:Name="btnForward"  />
    </StackPanel>
    <StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal">
      <Button Content="1" Click="Button_Click_1" />
      <Button Content="2" Click="Button_Click_2" />
    </StackPanel>
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
      <ContentControl x:Name="borderContent"  />
    </ScrollViewer>
  </DockPanel>
</Window>