2010-07-09 7 views
3

(Silverlight 4.0 및 VS 2010 사용)
그래서 C# 파일에 Rank이라는 속성을 만들었습니다. UserControl xaml 파일의 컨트롤에 어떻게 묶을 수 있습니까?XAML의 종속성 속성을 바인딩하는 방법

내 코드 : (TopicListItem.xaml.cs)

#region Rank (DependencyProperty) 

    /// <summary> 
    /// Rank 
    /// </summary> 
    public int Rank 
    { 
     get { return (int)GetValue(RankProperty); } 
     set { SetValue(RankProperty, value); } 
    } 
    public static readonly DependencyProperty RankProperty = 
     DependencyProperty.Register("Rank", typeof(int), typeof(TopicListItem), 
     new PropertyMetadata(0, new PropertyChangedCallback(OnRankChanged))); 

    private static void OnRankChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     ((TopicListItem)d).OnRankChanged(e); 
    } 

    protected virtual void OnRankChanged(DependencyPropertyChangedEventArgs e) 
    { 

    } 

    #endregion Rank (DependencyProperty) 

내가 내 TopicListItem.xaml

... 
<Textblock Text="{TemplateBinding Rank}"/> 
... 

하지만 정말 작동하지 않습니다에서이 작업을 수행 할 수 있습니다.

답변

5

같은 UserControl을에 의해 노출 된 속성에있는 UserControl의 XAML에서 속성을 결합해야하는 경우 다음과 같은 패턴을 사용 -이 가정을 만드는 것을

<TextBlock Text="{Binding Parent.Rank, ElementName=LayoutRoot}" /> 

참고 그 UserControl을 내부 루트 내용 요소 "LayoutRoot"라는 이름이 부여되었습니다.

+0

Akash 답변과 동일합니까? – JeroenEijkhof

+0

고마워 앤서니 ... Akash가 읽지 않은 동안 실제로 작동했는데 Akash가 왜 실패했는지 추론하기 위해 Akash의 대답에 대한 의견을 참조하십시오. 이 UserControl 실제로 자식 및 목록의 일부 ... 감사합니다 다시 : – JeroenEijkhof

+0

안토니, 내가 이것에 대한 자세한 내용을 읽고 특히 논리/이유는 '부모'및 'ElementName = '... 고마워! – JeroenEijkhof

-1

아마도 <Textblock Text="{Binding Rank}"/>입니다.

+0

작동하지 않았습니다 ... 'ElementName = ...'이 필요합니다. – JeroenEijkhof

5
<UserControl xmlns..... 
    x:Name="myUserControl"> 

.... 

<Textblock Text="{Binding Rank,ElementName=myUserControl}"/> 

.... 

</UserControl> 

ElementName을 x : UserControl의 이름으로 설정해야합니다. x : Name이 비어 있으면 하나를 정의하십시오.

+1

'UserControl'이 RootVisual 또는 탐색 된 페이지로만 사용되면 제대로 작동합니다. 그러나 자식 컨트롤로 사용된다면이 접근법은'UserControl' 이름이 외부 xaml에 의해 재 할당 될 수 있기 때문에 실패 할 것입니다. – AnthonyWJones

+0

나는 그런 것들을 발견하지 못했다. 다른 방법은 상대적 소스를 스스로로 지정하는 것이다. –

+0

이 이름은 UserControl 자체가 아닌 UserControl 내의 루트 UIElement에 있어야하므로 작동하지 않았습니다. – JeroenEijkhof

1

당신은, TemplateBinding, 바인딩하지 사용할

또한

당신이 바인딩 오류가 당신에게보고하는 방법에 보길 원하는 것일 수도 필요 - WPF에서 매우 도움이 기본 동작은 문제를 바인딩에 대해 추측 당신을 떠날 것입니다 만, 실제로 켜면 많은 유용한 정보를 얻을 수 있습니다.

+0

팁에 감사드립니다. 내가 이걸 할 수 있을까? – JeroenEijkhof

+0

VS2010에는 도구 -> 옵션 -> 디버깅 -> 출력 창에 옵션이 있습니다. 이전 버전에 대해서는 확신하지 못했지만 PresentationTraceSources를 사용하여 코드의 위크를 높일 수 있습니다. 이는 Google에 좋은 용어 일 것입니다. –

관련 문제