2011-04-06 66 views
42

在下面提供的XAML中,我有時並沒有Phone的價值。發生這種情況時,該值缺失,但TextBlock仍佔用面板中的空間。我想隱藏空TextBlock s在StackPanel佔據空間。如何隱藏空的TextBlock?

這裏的XAML:

<StackPanel> 
    <TextBlock Text="{Binding Path=FirstName}" /> 
    <TextBlock Text="{Binding Path=LastName}" /> 
    <TextBlock Text="{Binding Path=Phone}" /> 
    <TextBlock Text="{Binding Path=Email}" /> 
</StackPanel> 

我讀過this article,但接受的答案不爲我工作:

<StackPanel> 
    <TextBlock Text="{Binding Path=FirstName}" /> 
    <TextBlock Text="{Binding Path=LastName}" /> 
    <TextBlock Text="{Binding Path=Phone}"> 
     <TextBlock.Style> 
      <Style TargetType="TextBlock"> 
       <Style.Triggers> 
        <Trigger Property="Text" Value="{x:Null}"> 
         <Setter Property="Visibility" Value="Collapsed" /> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </TextBlock.Style> 
    </TextBlock> 
    <TextBlock Text="{Binding Path=Email}" /> 
</StackPanel> 

我是不是犯了一個錯誤的地方,或者是接受回答錯誤?我該怎麼做才能實現我的目標?

+0

是電話屬性的String.Empty或空創建或當它刪除嗎? – 2011-04-06 23:07:36

+0

它是空的。問題解決了:) – Boris 2011-04-06 23:15:19

回答

62

您可能需要使用:

<Style TargetType="TextBlock"> 
     <Style.Triggers> 
      <Trigger Property="Text" Value=""> 
       <Setter Property="Visibility" Value="Collapsed" /> 
      </Trigger> 
     </Style.Triggers> 
</Style> 

也許兩者:

<Style TargetType="TextBlock"> 
     <Style.Triggers> 
      <Trigger Property="Text" Value=""> 
       <Setter Property="Visibility" Value="Collapsed" /> 
      </Trigger> 
      <Trigger Property="Text" Value="{x:Null}"> 
       <Setter Property="Visibility" Value="Collapsed" /> 
      </Trigger> 
     </Style.Triggers> 
</Style> 
+1

這具有隱藏每一個我的標籤的好奇效果,包括複選框右側的文本。不好:) – 2012-01-09 20:08:30

10

您可以使用DataTrigger

<TextBlock Text="{Binding Path=Title}"> 
    <TextBlock.Style> 
     <Style TargetType="TextBlock"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Title}" Value="{x:Null}"> 
        <Setter Property="Visibility" Value="Collapsed" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 
36

而是引入一種風格只是爲了這一點,對於這種事情,我傾向於使用一個處理空字符串或空字符串的轉換器。

<TextBlock Text="{Binding Foo}" 
      Visibility="{Binding Foo, 
         Converter={StaticResource StringToVisibilityConverter}}" /> 

StringToVisibilityConverter這樣定義:

[ValueConversion(typeof(string), typeof(Visibility))] 
public class StringToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (string.IsNullOrEmpty((string)value)) 
     { 
      return Visibility.Collapsed; 
     } 
     else 
     { 
      return Visibility.Visible; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

我通常使用'Converter's來轉換數據,以使它對最終用戶更加用戶友好,但是你的代碼工作得很好。不過,我更喜歡我的場景的風格。感謝任何一種答案! – Boris 2011-04-06 23:17:37

+0

一般來說,我同意這一點,但看看WPF發佈的轉換器中內置的ONE:BooleanToVisibilityConverter。它確實做了你正在做的事情,但是使用布爾值 – 2011-04-06 23:22:34

+0

+1總是很好的將兩個執行相同功能的觸發器壓縮成一個。 – CodeNaked 2011-04-07 11:26:45