2011-11-07 2 views
4

DataTemplate에 다른 두통이 있습니다.SL4. ElementName에 의한 바인딩이 DataTemplate 내에서 작동하지 않습니다.


설명 : 실버 라이트 4, MVVM 등 (실버 LOB 애플리케이션을위한 개발자 도구의 standart 세트)를 사용.

엔티티 목록은 DataGrid에 성공적으로 바인딩됩니다. 하나의 속성 (nullable bool BoolValue)은 엔티티 동작을 담당하며 그림이있는 DataGrid에 표시됩니다. 클릭하면 LayoutRoot 요소 내의 일부 컨트롤의 가시성이 변경됩니다.

문제점 : 문제는 DataTemplate 내에 바인딩이 템플릿 내에 배치 된 것을 제외하고 다른 요소를 참조하지 않는 ElementName 불행히도 또는 다행이다.

코드 샘플 : 위의 예에서

<navigation:DataGridTemplateColumn Width="40" 
           CanUserReorder="True" 
           CanUserSort="False"> 
    <navigation:DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
      <Border Background="GhostWhite"> 
      <Grid> 
       <Image x:Name="ImageWithTrigger" 
        Grid.Column="1" 
        Margin="10,4,0,0" 
        HorizontalAlignment="Left" 
        VerticalAlignment="Center" 
        Cursor="Hand" 
        Source="images/someImage.png" 
        Stretch="None" 
        Visibility={Binding BoolValue, Converter={StaticResource boolToVisibilityConverter} }> 
       <i.Interaction.Triggers> 
       <i:EventTrigger EventName="MouseLeftButtonDown"> 
        <AttachedBehaviors:TrickyBehavior FrameworkElementToHide="{Binding ElementName=FirstControlOutside}" 
                 FrameworkElementToShow="{Binding ElementName=SecoundControlOutside}"/> 
       </i:EventTrigger> 
       </i:Interaction.Triggers> 
      </Grid> 
      </Border> 
      </DataTemplate> 
    </navigation:DataGridTemplateColumn.CellTemplate> 
</navigation:DataGridTemplateColumn> 

는 FrameworkElementToHide 및 FrameworkElementToShow는 항상 null입니다.

인터넷에는 꽤 비슷한 문제와 해결책이 많이 있지만이 문제를 해결하는 데 직접적이고 우아한 방법을 찾지 못했습니다.

답변

6

post에 내 대답을 살펴 보시기 바랍니다.

ElementName 바인딩이 DataGrid 내에서 작동하지 않습니다. 이 문제를 해결하려면 프록시가 필요합니다. 그러나 ElementName 바인딩은 보통 DataTemplates에 대해 작동합니다 (예 : ItemTemplate, ListBox

+0

'DataGrid' 템플릿에서'ElementName'으로 바인드 할 방법이 없다는 것을 의미합니까? –

+0

아니, 난 그렇게 생각하지 않아 ... –

+0

Dan Wahlin의 예에서 'DataTemplate'에서 ViewModel에 액세스하는 유일한 방법을 찾았지만'StaticResource'를 사용하여 제 경우에는 제대로 작동하는 것 같습니다. –

1

[이 코멘트해야하지만, 나는 허용 글자 수를 초과] 나는이 문제를 해결하는 두 가지 방법을 참조

을 :

  1. ContentControl에서 상속; 두 상태를 전환 할 IsShowing 속성 (bool)을 추가하십시오. 새 컨트롤의 컨트롤 템플릿에서 내용 표시 및 숨기기에 필요한 애니메이션을 만듭니다.
  2. 요소에 대한 참조를 보유 할 사전을 보유 할 정적 클래스를 추가하십시오. 새로운 값이 true 인 경우 메타 데이터에 PropertyChangedCallback과 함께 연결된 속성 (부울)을 추가합니다. 사전에 요소 (속성이 첨부 된 요소)를 추가하고, false이면 사전에서 요소를 제거합니다. 각 요소의 핵심은 이름입니다. 비헤이비어는 요소의 이름 인 두 개의 문자열을 가져오고 사전에서 찾게됩니다.

두 가지 방법이 너무 우아하지 않은,하지만 실버 라이트의 ... ;-)

+0

감사합니다. 재미있는 접근법. –

관련 문제