2009-12-27 1 views
2

트리거를 사용하여 XAML에서이 작업을 수행하려고합니다. 어떻게해야합니까?어떻게하면 XAML에서이 작업을 수행 할 수 있습니까?

If ListBox1.SelectedIndex > -1 Then 
     Border1.Visibility = Windows.Visibility.Visible 
    Else 
     Border1.Visibility = Windows.Visibility.Hidden 
    End If 

이 XAML 코드는 작동하지 않습니다. SelectedIndex 구성원에 유효한 형식 이름이 없기 때문에 구성원이 유효하지 않습니다.

  <ListBox.Triggers> 
       <Trigger SourceName="ListBox1" Property="SelectedIndex" Value="False"> 
        <Setter TargetName="Border1" Property="Visibilty" Value="Hidden" /> 
       </Trigger> 
      </ListBox.Triggers> 

답변

6

xaml에서 어떻게 이것을 수행하려고합니까?

이 오류 메시지가 나타나면 trigger 내에서 속성과 함께 유형 이름을 언급해야합니다.

<Trigger SourceName="ListBox1" Property="ComboBox.SelectedIndex" Value="-1"> 
    <Setter TargetName="Border1" Property="Border.Visibility" Value="Hidden" /> 
</Trigger> 

또한, 당신이 <ListBox.Triggers> 컬렉션 트리거를 추가하는 것 같다,하지만 당신은이 컬렉션에 EventTrigger를 추가 할 수 있습니다. 따라서 ListBox에 대한 스타일을 선언하여 트리거를 추가해야하며 Border 요소는 ListBox의 ControlTemplate 내에 있어야하지만, 테두리가 ListBox 외부에있는 것으로 보이는 경우 스타일을 선언해도 해결되지 않습니다. 대신 ValueConverter (IndexToVisibilityConverter)를 사용하여 SelectIndex 속성에 바인딩을 사용해야합니다. 코드 변환기에서이 변환기를 정의하고 자원에 추가해야합니다.

<Border Visibility={Binding Path=SelectedIndex, ElementName=ListBox1, Converter={StaticResource IndexToVisibilityConverter}}/> 

선택 사항은 전적으로 귀하의 요구 사항에 달려 있습니다.

+0

이것은 더가는 길처럼 보입니다 ... –

+0

내가 필요한 것은 ... 그리고 그것은 효과가있었습니다! –

4

그것은이만큼 간단하다 :

<Border x:Name="Border1" ... Visibility="Visible" ... /> 

... 

<Trigger SourceName="ListBox1" Property="ListBox.SelectedIndex" Value="-1"> 
    <Setter TargetName="Border1" Property="UIElement.Visibilty" Value="Hidden" /> 
</Trigger> 

업데이트 나는 당신이 목록 상자에 직접 트리거를 사용하려는 것을 게시 된 새로운 코드에서 볼

. SourceName을 사용하려면 트리거가 ControlTemplate에 있어야합니다. UI가 "사용자 지정 컨트롤"(기본 설정)을 사용하여 완료되면 ControlTemplate이 이미 있어야합니다. 그렇지 않으면 XAML을 일반 "ContentControl"(기본 클래스가 아닌 기본 클래스)으로 묶어 쉽게 추가 할 수 있습니다 하위 클래스)을 만들고 템플릿을 다음과 같이 설정하십시오.

<Window ...> 
    ... 

    <ContentControl> 
    <ContentControl.Template> 
     <ControlTemplate TargetType="{x:Type ContentControl}"> 

     <Grid> 
      ... 
      <ListBox x:Name="ListBox1" ... /> 
      ... 
      <Border x:Name="Border1"> 
      ... 
      </Border> 
     </Grid> 

     <ControlTemplate.Triggers> 
      <Trigger SourceName="ListBox1" Property="ListBox.SelectedIndex" Value="-1"> 
      <Setter TargetName="Border1" Property="UIElement.Visibility" Value="Hidden" /> 
      </Trigger> 
     </ControlTemplate.Triggers> 

     </ControlTemplate> 
    </ContentControl.Template> 

    </ContentControl> 
    ... 
</Window> 

더 나은 해결책은 사용자 지정 컨트롤을 사용하는 것입니다. 변환기로 바인딩을 사용하는 것은 가능하지만 우아한 IMHO는 아닙니다.

+0

오류가 발생합니다. 'SelectedIndex'멤버는 유효한 유형 이름이 없기 때문에 유효하지 않습니다. –

+0

트리거가 ListBox의 ControlTemplate/DataTemplate에 없으므로 속성 이름을 한정해야합니다 ('Property = "ListBox.SelectedIndex"'). 나는 나의 대답을 업데이트했다. –

+0

트리거는 ControlBox/DataTemplate에서 사용해야하며 ListBox에서는 직접 사용해서는 안됩니다. ControlTemplates를 사용하지 않는 경우 ContentPresenter가 포함 된 제네릭 컨트롤을 추가 할 수 있습니다. –