2016-06-03 6 views
0

У меня есть usercontrol (метка и текстовое поле). Я хотел бы привязать текст пользовательского элемента управления к имени свойства из класса DTO Employee (Employee.Name), где bind установить в главном окне, вне UserControl. Это мой UserControl (взгляд на этикетке элементов управления и текста)wpf привязать свойство usercontrol к datacontext mainwondow

<UserControl x:Class="TestCompany.controls.textEdit" 
     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" 
     xmlns:local="clr-namespace:TestCompany.controls" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 

<Grid > 
    <Grid.RowDefinitions> 
     <RowDefinition Height="60" /> 
     <RowDefinition MinHeight="50" /> 
    </Grid.RowDefinitions> 
    <Label Name="label" Content="{Binding Caption}" Grid.Row="0" FontSize="35" FontWeight="Light"/> 
    <TextBox Name="textbox" Text="{Binding Text}" Grid.Row="1" FontSize="33" Background="White" /> 
</Grid> 

Подпись это название управления и текст Displ Айс Значение

А вот код позади

public string Caption 
    { 
     get 
     { 
      return (string)GetValue(CaptionProperty); 
     } 

     set 
     { 
      SetValue(CaptionProperty, value);     
     } 
    } 

    public static DependencyProperty CaptionProperty = 
     DependencyProperty.Register("Caption", typeof(string), typeof(textEdit), null); 


    public string Text 
    { 
     get 
     { 
      return (string)GetValue(TextProperty);     
     } 

     set 
     { 
      SetValue(TextProperty, value);     
     } 
    } 

    public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(textEdit), null); 

Теперь в главном окне, это то, как я использую мой пользовательский элемент управления

<controls:textEdit Caption="Name" Text="{Binding Name}" Grid.Column="0" HorizontalAlignment="Stretch" Margin="0,0,20,0" /> 

Затем в главном окне, из списка Сотрудники, я беру выбранный вариант, и я назначаю его в контекст

this.DataContext = EmployeeObject; // Name = "Joe" 

Но свойство Text usercontrol не отображает «Joe». Даже сеттер собственности никогда не называется. Странно это, что если в конструкторе моего UserControl я не назначайте UserControl.Datacontext к этому

DataContext = this; // within the constructor of UserControl 

тогда даже контроль этикетки пуст (контрольная метка связана со свойством зависимостей Caption). Я рассмотрел множество подобных проблем в stackOverflow и еще где. (RelativeSource Self и т. Д.). Ничто не работает ... Текст свойство моего пользовательского элемента управления не отображает значения из набора DataContext в главном окне ...

Любая помощь будет принята с благодарностью

+0

Возможный дубликат [Свойство DependencyProperty для привязки к UserControl] (http://stackoverflow.com/questions/16985382/binding-to-usercontrol-dependencyproperty); прочитайте также комментарии о DataContext в соответствии с принятым ответом – ASh

+0

Спасибо за предложение. Я применил предложенное решение. Текст правильно отображает значение. Но метка теперь пуста – TheSoul

+0

Можете ли вы включить код при создании EmployeeObject? – tgpdyk

ответ

1

Вы должны установить DataContext в UserControl к в вашем главном окне и DataContext от Grid до UserControl. Это означает, что когда UserControl ищет свои данные, он выглядит в DataContext, который он наследует от MainWindow, но когда ваш Grid ищет свои данные, он смотрит внутри UserControl. Вы делаете это так:

<UserControl ... 
    d:DesignHeight="300" d:DesignWidth="300" 
    x:Name="ThisControl"> 

<Grid DataContext="{Binding ElementName=ThisControl}"> 
... 

См. http://blog.scottlogic.com/2012/02/06/a-simple-pattern-for-creating-re-useable-usercontrols-in-wpf-silverlight.html.

+0

Спасибо. Я сделал то, что вы сказали. Я определил DataContextin Grid в UserControl. Тем не менее текст правильно связывается. Но метка все еще пуста. – TheSoul

+0

Хорошо, теперь он работает. Спасибо за помощь! – TheSoul

+0

Отлично. Эта статья действительно помогла мне понять DataContext. – PScr

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