2

主に、ナビゲーション ウィンドウ ジャーナルでは存在できる子の数を制御できないため、ナビゲーション ウィンドウの独自の単純なバージョンを実装しました。そのため、ウィンドウ内に境界線を使用し、その子を毎回変更しています。子供として、私は UserControl を使用しています。Window のタイトルを現在の子の Title プロパティにバインドしたいと考えています。どういうわけか私はそれを行う方法を理解できません。

メインウィンドウ 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>

メインウィンドウ コードビハインド:

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");
        }
    }
}

ユーザー コントロール 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 内のバインディングも機能していません。私は何を間違っていますか?

4

2 に答える 2

1

問題は、のChildプロパティがでBorderはないDependencyPropertyため、変更通知がないことです。Binding変更するたびに手動で更新する必要がありますChild

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

private void Button_Click_2(object sender, RoutedEventArgs e)
{
    this.borderContent.Child = new ContentPage("TITLE 2");
    UpdateTitleBindingExpression();
}
private void UpdateTitleBindingExpression()
{
    BindingExpressionBase beb = BindingOperations.GetBindingExpressionBase(this, Window.TitleProperty);
    if (beb != null)
    {
        beb.UpdateTarget();
    }
}
于 2012-06-21T07:56:09.313 に答える
0

なぜあなたがしていることをしているのかわかりませんが、あなたの質問に関して:

「ソース」を「相対ソース」に変更します

<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>
于 2012-06-21T07:45:09.147 に答える