2013-11-20 4 views
0

Я хочу связать «SomeText» с моим UserControl в Содержимое моей метки.Связывание данных WPF с UserControl

В настоящее время у меня есть UserControl, который просто отображает мой «SomeText». Файл XAML и Code Behind можно увидеть ниже.

<UserControl x:Class="TabHeader.UserControl1" 
      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="183" d:DesignWidth="235" 
      x:Name="uc"> 
    <Grid> 
     <Label Height="43" HorizontalAlignment="Left" Margin="57,102,0,0" Name="textBlock1" Content="{Binding Path=SomeText, ElementName=uc}" VerticalAlignment="Top" Width="86" /> 
    </Grid> 
</UserControl> 


namespace TabHeader 
{ 
    /// <summary> 
    /// Interaction logic for UserControl1.xaml 
    /// </summary> 
    public partial class UserControl1 : UserControl 
    { 
     private string someText; 

     public UserControl1() 
     { 
      this.SomeText = "23"; 

      InitializeComponent(); 
     } 

     public string SomeText 
     { 
      get 
      { 
       return someText; 
      } 
      set 
      { 
       someText = value; 
      } 
     } 
    } 
} 

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

<Window x:Class="TabHeader.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:vw="clr-namespace:TabHeader" 
     Title="MainWindow" Height="350" Width="525" Name="Tabs"> 
    <Grid> 
     <TabControl Height="262" HorizontalAlignment="Left" Margin="47,26,0,0" Name="tabControl1" VerticalAlignment="Top" Width="366"> 
      <TabControl.Resources> 
       <Style TargetType="TabItem" x:Key="tabItemHeaderStyle" > 
        <Setter Property="HeaderTemplate" > 
         <Setter.Value> 
          <DataTemplate DataType="{x:Type TabItem}"> 
           <StackPanel Orientation="Horizontal"> 
            <Label Content="{Binding Path=Header, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=TabItem}}"/> 
            <Label Content="{Binding Path=SomeText, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=vw:UserControl1}}"/> 
           </StackPanel> 
          </DataTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 

      </TabControl.Resources> 

      <TabItem Style="{StaticResource tabItemHeaderStyle}" Header="TI 1" Name="tabItem1" Width="100"> 
       <vw:UserControl1 x:Name="UserControl11"></vw:UserControl1> 
      </TabItem> 
      <TabItem Style="{StaticResource tabItemHeaderStyle}" Header="TI 2" Name="tabItem2"> 
      </TabItem> 

     </TabControl> 
    </Grid> 
</Window> 

Любая помощь с этим была бы весьма признательна.

Cheers.

Редактировать 1 Для всех, кому интересен мой рабочий код ниже, где я использовал DependencyProperty.

MainWindow.xaml

<Grid> 
<TabControl Height="262" HorizontalAlignment="Left" Margin="47,26,0,0" Name="tabControl1" VerticalAlignment="Top" Width="366"> 
    <TabControl.Resources> 

     <Style TargetType="TabItem" x:Key="tab1ItemHeaderStyle"> 
      <Setter Property="HeaderTemplate" > 
       <Setter.Value> 
        <DataTemplate DataType="{x:Type TabItem}"> 
         <StackPanel Orientation="Horizontal"> 
          <Label Content="{Binding Path=Header, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=TabItem}}"/> 
          <Label Content="{Binding Path=UC1Figure, ElementName=uc1}"/> 
         </StackPanel> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </TabControl.Resources> 

    <TabItem Style="{StaticResource tab1ItemHeaderStyle}" Header="[Tab 1]" Name="tabItem1" Width="100"> 
     <vw:UserControl1 x:Name="uc1"></vw:UserControl1> 
    </TabItem> 
<TabControl> 
</Grid> 

UserControl1.xaml

<Grid> 
    <Label Height="43" HorizontalAlignment="Left" Margin="69,128,0,0" Name="textBlock1" Content="{Binding Path=UC1Figure, ElementName=uc}" VerticalAlignment="Top" Width="100" /> 
    <Button Name="updateSomeFigure" Content="Press Me" Click="updateSomeFigure_Click" Width="100" Height="100" Margin="69,12,66,71" /> 
</Grid> 

UserControl1.xaml.cs

public partial class UserControl1 : UserControl 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    public static readonly DependencyProperty SomeFigureProperty = 
     DependencyProperty.Register("UC1Figure", typeof(int), typeof(UserControl1)); 

    public int UC1Figure 
    { 
     get { return (int)this.GetValue(SomeFigureProperty); } 
     set { this.SetValue(SomeFigureProperty, value); } 
    } 

    private void updateSomeFigure_Click(object sender, RoutedEventArgs e) 
    { 
     UC1Figure = UC1Figure + 1; 
    } 
} 
+0

'<Содержимое метки =" {Путь привязки = заголовок, RelativeSource = {RelativeSource Mode = FindAncestor, AncestorType = vw: UserControl1}} "/>' не работает. У вас нет элементов 'UserControl1' в качестве родителя для' TabItem', а ваш 'UserControl1' не имеет свойства' Header'. – sthotakura

+0

Извините, 'Header' должен быть SomeText – metoyou

+0

Нет проблем. Даже после того, как вы изменили это, это не сработает, потому что ваш связывание «RelativeSource» ошибочен. Для вашего 'TabItem' нет родительского элемента типа' UserControl1' – sthotakura

ответ

0

Если вы хотите, чтобы данные связать свойство в пользовательском интерфейсе вашей UserControl , у вас есть два варианта. Во-первых, реализовать код INotifyPropertyChanged Interface в вашем коде. Второй - определить DependencyProperty s вместо обычных свойств CLR. Вы можете узнать, как это сделать на странице Dependency Properties Overview на MSDN.

Возможно, вы также захотите прочитать страницу Data Binding Overview‎ на MSDN перед началом работы Binding.

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