使用转换器隐藏WPF中的网格

时间:2013-01-06 20:30:21

标签: wpf windows-phone-7 xaml converter

我有这样的网格:

<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>

如果变量binded为空,我想隐藏整个网格。 我想我需要使用转换器,但我需要一些语法帮助。

有人可以帮我吗?

非常感谢:)

3 个答案:

答案 0 :(得分: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}}" />

答案 1 :(得分:0)

在为网格创建样式时,只能在xaml中编写它。但是你必须写一个Style foreach不同的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&#39;解决方案更好,因为您可以将它用于每个Binding,在我的解决方案中,您必须使用2个DataTriggers编写一个带有foreach Binding的样式。

答案 2 :(得分: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>