2013-01-06 28 views
1

我有一個這樣的網格:使用轉換器隱藏的網格,WPF

<Grid> 
    <Grid.RowDefinitions> 
    <RowDefinition /> 
    <RowDefinition /> 
    </Grid.RowDefinitions> 
    <TextBlock Grid.Row="1" Margin="12,0,0,10" x:Name="TxtBox_Email" Text="{Binding m_strMail}" /> 
</Grid> 

我想隱藏整個網格如果綁定變量爲空。 我想我需要使用一個轉換器,但我需要一些幫助的語法。

任何人都可以幫助我嗎?

非常感謝:)

回答

3

是的,你說得對。你可以寫一個轉換器,像這樣:

public class StringLengthVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
    System.Globalization.CultureInfo culture) 
    { 
     var strValue = value as String; 
     return string.IsNullOrEmpty(strValue) ? Visibility.Collapsed : Visibility.Visible; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
    System.Globalization.CultureInfo culture) 
    { 
     //We can't support this 
     throw new NotImplementedException(); 
    } 
} 

要使用轉換器,將資源添加到您的網頁:

<phone:PhoneApplicationPage.Resources> 
    <local:StringLengthVisibilityConverter x:Key="LengthConverter" /> 
</phone:PhoneApplicationPage.Resources> 

替代local爲指向您的轉換器的CLR命名空間進行了xmlns。

在那之後,我們可以用我們的轉換器在電網:

<Grid Visibility="{Binding Path=m_strMail, Converter={StaticResource LengthConverter}}" /> 
+0

非常感謝!我認爲它可以用更少的代碼!有沒有辦法只在XAML中做?謝謝 –

+0

@WalterFabioSimoni不幸的是沒有。 C#(或VB.NET)必須在某個時候涉足。 – vcsjones

0

這是可能的,當你創建網格樣式,以它只寫在XAML。但是你必須寫一個不同的Binding風格。本例中的Viewmodel只包含一個名爲MyString的字符串Property。

<Window xmlns:local="clr-namespace:PlayGroundSecond"> 
    <Window.DataContext> 
     <local:SimpleViewModel/> 
    </Window.DataContext> 

    <Window.Resources> 
     <Style x:Key="MyOwnTextBlockStyle" TargetType="{x:Type TextBlock}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding MyString}" Value="{x:Null}"> 
        <Setter Property="Visibility" Value="Collapsed"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding MyString}" Value=""> 
        <Setter Property="Visibility" Value="Collapsed"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Window.Resources> 
    <Grid> 
     <TextBlock Style="{StaticResource MyOwnTextBlockStyle}" Text="MyText"/> 
    </Grid> 
</Window> 

我覺得vcsjones的解決方案是最好的,因爲你可以用它爲每一個有約束力和我的解決方案,你必須寫一個樣式2個DataTriggers的foreach綁定。

0

沒有轉換器,你可以使用這樣

 <Grid> 
      <Grid.Style> 
       <Style> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Path=m_strMail}" Value=""> 
          <Setter Property="FrameworkElement.Visibility" Value="Collapsed" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Grid.Style> 
      <Grid.RowDefinitions> 
       <RowDefinition /> 
       <RowDefinition /> 
      </Grid.RowDefinitions> 
      <TextBlock Grid.Row="1" Margin="12,0,0,10" x:Name="TxtBox_Email" Text="{Binding m_strMail}" /> 
     </Grid>