【问题标题】:Use a converter to hide a grid in WPF使用转换器隐藏 WPF 中的网格
【发布时间】:2012-12-20 14:53:31
【问题描述】:

我有一个这样的网格:

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

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

有人可以帮帮我吗?

非常感谢:)

【问题讨论】:

    标签: wpf windows-phone-7 xaml converter


    【解决方案1】:

    是的,你是对的。你可以这样写一个转换器:

    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}}" />
    

    【讨论】:

    • 非常感谢!我认为它可以用更少的代码!有没有办法只在 XAML 中做?谢谢
    • @WalterFabioSimoni 不幸的是没有。 C#(或 VB.NET)必须在某个时候参与进来。
    【解决方案2】:

    当您为网格创建样式时,可以只在 xaml 中编写它。但是您必须为每个不同的绑定编写一个样式。此示例中的 Viewmodel 仅包含一个名为 MyString 的字符串属性。

    <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 的解决方案更好,因为您可以将它用于每个 Binding,并且在我的解决方案中,您必须为每个 Binding 编写带有 2 个 DataTriggers 的 Style。

    【讨论】:

      【解决方案3】:

      没有转换器你可以这样使用

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

      【讨论】:

        猜你喜欢
        • 2014-05-20
        • 1970-01-01
        • 2011-01-30
        • 1970-01-01
        • 2023-01-17
        • 2011-02-01
        • 1970-01-01
        • 2011-10-18
        相关资源
        最近更新 更多