2012-03-19 4 views
0

그래서 ColoredTextBlock이라고하는 Windows Phone 7 응용 프로그램에 대한 사용자 지정 사용자 정의 컨트롤을 만들려고합니다. 당신은 아마 그것이 무엇을하는지 짐작할 수 있습니다.WP7에서 사용자 지정 사용자 정의 컨트롤의 속성에 바인딩하는 문제

어쨌든 ColoredTextBlock에는 사용자가 텍스트 및 스타일을 설정할 수있게하려는 TextBlock이 있습니다. 난 그냥 같은 단지 통과 간단한 속성을 만드는 시도 할 경우

는 :

public string Text 
    { 
     get { return Label.Text; } 
     set 
     { 
      Label.Text = value; 
      NotifyPropertyChanged("Text"); 
     } 
    } 

그것은 매우 비밀 ArgumentException이 발생합니다. 그러나 입력 텍스트를 설정하면 다음과 같습니다.

<MyRepresentative:ColoredTextBlock Text="Some Text" BackgroundColor="Red" /> 

모든 것이 정확히 예상대로 작동합니다.

반면에 종속성 속성을 사용하고 내부 TextBlock을이 속성에 바인딩 한 다음이 속성에 외부 데이터를 바인딩하는 고급 경로를 사용하면 아무 것도 표시되지 않습니다.

public string Text 
    { 
     get { return (string)GetValue(TextProperty); } 
     set 
     { 
      SetValue(TextProperty, value); 
      NotifyPropertyChanged("Label"); 
     } 
    } 

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

텍스트를 수동으로 삽입하면 다시 작동합니다. 여기

내 사용자 지정 컨트롤의 XAML의 :

<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
x:Class="MyRepresentative.ColoredTextBlock" 
d:DesignWidth="456" d:DesignHeight="43" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}"> 

    <Grid x:Name="LayoutRoot" Background="Transparent"> 
     <Rectangle Stroke="Black"> 
      <Rectangle.Fill> 
       <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
        <GradientStop Color="{Binding DimBackgroundColor}" Offset="0"/> 
        <GradientStop Color="{Binding BrightBackgroundColor}" Offset="0.85"/> 
        <GradientStop Color="{Binding BrightBackgroundColor}" Offset="0.15"/> 
        <GradientStop Color="{Binding DimBackgroundColor}" Offset="1"/> 
       </LinearGradientBrush> 
      </Rectangle.Fill> 
     </Rectangle> 
     <TextBlock Text="{Binding Text}" Margin="5,0" d:LayoutOverrides="Width"/> 
    </Grid> 
</UserControl> 

나는 오늘의 좋은 부분이 내 머리를 건 드리는 등 다양한 기사를보고 있었고, 나는 전혀 확신 이 점은 내가 뭔가 부족한 것을 놓치고 있지만, 나는 그것을 찾을 수 없다.

UPDATE 1은 : 더 그것으로보고 한 후, 어떤 이유로 내가 바인딩을 설정하더라도, 적어도 지금까지 내가 말할 수있는,이 실제로 설정되고 있음을 표시하지 않는 것 같습니다 .

업데이트 2 : 내 DataContext가 올바르게 설정되었는지 확인하는 방법에 대한 설명을 받았습니다. 예, 이것은 제가 처음 생각한 것 중 하나였습니다. 내 xaml에 아래 줄이 있습니다. 내가 Text="Some text" 같은 것으로 변경하지 않는 한

<MyRepresentative:ColoredTextBlock Text="{Binding Title}" BackgroundColor="Red" /> 
<TextBlock Text="{Binding Title}" Style="{StaticResource PhoneTextLargeStyle}" /> 

그래서 첫 번째 요소는 (전혀) 표시되지 않습니다. 두 번째 요소는 오류없이 완벽하게 작동합니다.

+0

DataContext를 설정할 위치에 코드를 포함하지 않았습니다 ({Binding}이 작동하도록). 또한 잘못된 부동산 이름에 대해 통보하고 있습니까? ("Text"라는 속성에서 NotifyPropertyChanged ("Label") 호출) –

+0

안녕하세요 Shahar, 위의 업데이트에서 귀하의 의견을 언급하려했습니다. 그 이름의 문제는 그것이 작동하도록하기 위해 여러 가지 다른 것들을 시도했기 때문입니다. 그러나 나는 그들이 지금 일관성이 있었는지 확인했다. –

+0

나는 당신의 통제 안에있는 귀하의 데이터 중심을 의미했습니다. 당신은 정상에 자신을 추천 -하지만 작동하는 샘플 코드에서 "제목"에 바인딩하고 컨트롤에서 "텍스트"에 바인딩합니다 –

답변

0

나는이 문제에 대한 해답을 알아내는 것을 끝내었지만, 잠시, 그리고 약간의 검색이 필요했습니다. 대답은 실제로 this answer에서 영감을 받았습니다.

답 : 나는 위의 예에서했던

DataContext="{Binding RelativeSource={RelativeSource Self}}" 

같은 :

대신 사용하여 루트 요소에 바인딩의 대신이 LayoutRoot에

<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    x:Class="MyRepresentative.ColoredTextBlock" 
    d:DesignWidth="456" d:DesignHeight="43" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}"> 

바인딩, 이 경우, 내 그리드 요소. 내가 여기처럼

<Grid x:Name="LayoutRoot"> 

이, 생성자에, 뒤에 코드에서 수행 할 수 있습니다

public ColoredTextBlock() 
    { 
     ... 
     LayoutRoot.DataContext = this; 
     ... 
    } 

설명 :이가 작동하는 이유를 충분히 이해하지

솔직히 말해서 누군가 설명 할 수 있다면 편집하십시오.

루트 요소에 바인딩 할 때 기존 바인딩을 재정의해야하는 것처럼 보입니다. 따라서이 컨트롤의 요소에 외부 요소를 바인딩하려고하면 해당 바인딩에 액세스 할 수 없기 때문에 오류가 발생합니다.

나 같은 문제를 겪고있는 다른 사람들을 도울 희망!

2

나는 행운이없는 자신과 같은 일을하는 데 정말로 어려움을 겪었습니다. 내가 발견 한 유일한 접근 방식은 작동하지 않습니다 (미안하지만 더 이상 찾을 수 없습니다).

C#을 통해 바인딩을 설정하면 성공했습니다. 이 shared here의 예가 있습니다.

: 방금 찾은 또 다른 해결책은 Element Name bindings입니다.

+0

제안 해 주셔서 감사합니다. 나는 그것들을 모두 확인했다. 불행히도, 그들은 나에게 지금 더 나은 결과를주는 것 같지 않습니다. ( –

관련 문제