2016-06-03 3 views
0

usercontrol (레이블 및 텍스트 상자가 있습니다. 사용자 정의 컨트롤의 Text 속성을 DTO 클래스의 Employee (Employee.Name)에 바인딩하고 싶습니다. MainWindow를 설정, 해당 UserControl의 외부.이wpf는 mainwondow의 datacontext에 usercontrol 속성을 바인딩합니다.

<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> 

캡션 내 UserControl을 (컨트롤 레이블 및 텍스트에서 보기)는 컨트롤의 제목과 텍스트 DISPL입니다 값을

을 AYS 그리고 여기 메인 창에서 지금

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

뒤에 코드이는 내가의 목록에서 MainWindow를에

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

그런 다음 내 사용자 지정 컨트롤을 사용하는 방법 종업원, 나는 선택한 하나를 받아서 컨텍스트에 할당합니다.

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

사용자 정의 컨트롤에 "Joe"가 표시되지 않습니다. 재산을 세터조차도 부름을받지 않습니다. 이 이상한 내 UserControl을의 생성자 내에서 나는이

DataContext = this; // within the constructor of UserControl 

에 UserControl.Datacontext 지정하지 않은 경우 다음도 레이블 컨트롤 (레이블 컨트롤 캡션 종속성 속성에 연결되어 있습니다) 비어 있다는 것입니다. 나는 stackOverflow와 그 밖의 곳에서 셀 수없는 비슷한 이슈들을 보았다. (RelativeSource Self ... 등). 아무것도 작동 ... 내 사용자 컨트롤의 텍스트 속성은 MainWindow를의 데이터 컨텍스트 세트에서 값을 표시하지 않습니다 ...

당신이 할 수있는 UserControlDataContext을 설정해야합니다 크게

+0

[Binding to UserControl DependencyProperty]의 가능한 복제본 (http://stackoverflow.com/questions/16985382/binding-to-usercontrol-dependencyproperty); Accepted Answer – ASh

+0

아래의 DataContext에 대한 의견도 읽어 주셔서 감사합니다. 거기 제공된 솔루션을 적용했습니다. 텍스트에 값이 올바르게 표시됩니다. 그러나 이제 레이블이 비어졌습니다. – TheSoul

+0

EmployeeObject를 만들 때 코드를 포함 할 수 있습니까? – tgpdyk

답변

1

을 주시면 감사하겠습니다 어떤 도움 메인 윈도우의 것, 그리고 Grid ~ UserControlDataContext입니다. 즉, UserControl이 데이터를 찾을 때 MainWindow에서 상속받은 DataContext를 확인하지만 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

고마워요. 나는 네가 한 말대로했다. UserControl 내에서 Grid의 DataContext를 정의했습니다. 그래도 텍스트는 올바르게 바인딩됩니다. 그러나 레이블은 여전히 ​​비어 있습니다. – TheSoul

+0

이제 작동 중입니다. 도와 줘서 고마워! – TheSoul

+0

좋습니다. 그 기사는 실제로 DataContext를 이해하는 방법을 알려주었습니다. – PScr