2009-08-20 2 views
0

간단한 요구 사항이라고 생각했지만 현재 수행 방법을 찾는 데 어려움이 있습니다.WPF의 바운드 요소에 대한 축소 가능 목록 '

I (예를 들어 1 호선, 2 호선, 3 호선, 라인 4) 주소로 바인딩하고있어

내가 뭘 원하는 나는, 디스플레이

Line1 
Line2 
Line3 
Line4 

이다 그러나 어떤 라인은 비어 있거나 null의 경우 붕괴 '싶습니다' ':

Line1 
Line3 
Line4 

나는 TextBlocks와 StackPanel을 시도했습니다 -하지만 난에 TextBlocks하는 방법을 알아 근무 한 적이없는'비어 있다면 '사라합니다.

<StackPanel> 
    <TextBlock Text="{Binding Line1}"></TextBlock> 
    <TextBlock Text="{Binding Line2}"></TextBlock> 
    <TextBlock Text="{Binding Line3}"></TextBlock> 
    <TextBlock Text="{Binding Line4}"></TextBlock> 
</StackPanel> 

또한 멀티 바인딩을 시도했지만 StringFormat에서 줄 바꿈을 얻는 방법을 찾지 못했습니다.

<TextBlock> 
    <TextBlock.Text> 
     <!-- Doesn't work: "System.FormatException" --> 
     <MultiBinding StringFormat="{}{1}\n{2}\n{3}\n{4}"> 
      <Binding Path="Line1"/> 
      <Binding Path="Line2"/> 
      <Binding Path="Line3"/> 
      <Binding Path="Line4"/> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

아이디어가 있으십니까?

답변

4

이것은 약간 못생긴지만 작동합니다.

<StackPanel> 
    <StackPanel.Resources> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Style.Triggers> 
       <DataTrigger 
        Binding="{Binding Text,RelativeSource={RelativeSource Self}}" 
        Value=""> 
        <Setter Property="Visibility" Value="Collapsed" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </StackPanel.Resources> 
    <TextBlock Text="{Binding Line1}" /> 
    <TextBlock Text="{Binding Line2}" /> 
    <TextBlock Text="{Binding Line3}" /> 
    <TextBlock Text="{Binding Line4}" /> 
</StackPanel> 
+0

그것은 못생긴입니다,하지만 나는 그것을 좋아한다고 생각합니다. 왜냐하면 클래스가 데이터의 표시 방법에 대해 걱정할 필요가 없기 때문입니다. – Benjol

+0

또한, TextBlock에 적용된 전역 스타일을 제거하고 싶지 않다면 스타일 선언에 BasedOn = "{StaticResource {x : Type TextBlock}}"을 추가하십시오. (제가 올바르게 생각한 것 같습니다) –

+0

@Benjol : 사용중인 경우 MVVM, 이것은 훨씬 더 자연스러워집니다. 즉, VM이 상황이 표시되는 방식에 대해 걱정하고 집계를 수행하는 읽기 전용 속성이있는 것입니다. –

2

그것은 쉬운 그냥 당신이 결합하는 또 다른 읽기 전용 하나에 모든 속성을 집계하는 것입니다 : 그러나

<TextBlock Text="{Binding Address}"/> 

을, 당신은 또한 각 TextBlockVisibility 바인딩 수 :

<TextBlock Text="{Binding Line1}" Visibility="{Binding Line1, Converter={StaticResource TextVisibilityConverter}}"/> 

TextVisibilityConverter 값이 null이거나 비어 있으면 Visibility.Collapsed을 반환합니다.

+1

그것은 제가 생각하는 일이 WPF는 항상 복잡 판명에 쉽게 될 방법 깜짝 놀라게한다 : 그 텍스트가 빈 문자열 인 경우 I는 TextBlock이를 축소하는 트리거와 스타일을 정의했다. 불행히도 그 반대는 항상 그런 것은 아닙니다 : ( – Benjol

관련 문제