【问题标题】:Control the visibility of GridView Footer based on a property within the Data根据 Data 中的属性控制 GridView Footer 的可见性
【发布时间】:2018-01-08 16:54:09
【问题描述】:

我正在做一个项目,如果在 Gridview 中加载的数据中有某个属性可用,我必须显示 FooterFooter
我使用自定义DataTemplateSelector 类在Gridview 中呈现数据,但该属性存在于主类中。

public class ItemTemplateData
{
  public string PropertyToShowFooter {get; set;}
}
// other classes derive from this main class
public class VideoItemTemplateData : ItemTemplateData
{
  // other properties not related here
}

现在,如果我在Gridview 中显式创建Footer 作为DataTemplate,它会按预期工作,但是如果我在Dictionary 中创建DataTemplate 并尝试使用它,它就不起作用。无论属性是否为空,它始终显示Footer。我使用Converter来转换属性来控制Visibility

更新:

没有代码/方法有效!!!无论如何,它总是显示或隐藏页脚。

// First method that I tried
<Gridview>
....
<GridView.FooterTemplate>
    <DataTemplate
        x:DataType="data:ItemTemplateData">
        <UserControl>
            <HyperlinkButton
                Visibility="{x:Bind PropertyToShowFooter, Mode=OneWay, Converter={StaticResource StringToVisibleConverter}}"
                Click="HyperlinkButton_Click"
                Style="{StaticResource GridViewFooterLinkStyle}"/>
            </UserControl>
        </DataTemplate>
</GridView.FooterTemplate>
</Gridview>

// 2nd method that I tried and really want this one to work.
<DataTemplate
        x:Key="GridViewCustomFooterTemplate"
        x:DataType="data:ItemTemplateData">
    <UserControl>
    <HyperlinkButton
        Visibility="{x:Bind PropertyToShowFooter, Mode=OneWay, Converter={StaticResource StringToVisibleConverter}}"
        Click="HyperlinkButton_Click"
        Style="{StaticResource GridViewFooterLinkStyle}"/>
    </UserControl>
</DataTemplate>

<GridView
     FooterTemplate="{StaticResource GridViewCustomFooterTemplate}"/>

更多详情TemplateSelector

public class DataTemplateSelectorClass : DataTemplateSelector
{
    public DataTemplate VideoItemTemplate { get; set; }


    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        if (item is VideoItemTemplateData)
        {
            return VideoItemTemplate;
        }

        return base.SelectTemplateCore(item, container);
    }
}

Footer 只是一个简单的HyperlinkButton,它应该基于转换器可见或折叠。如果属性中有一个非空字符串,它将是可见的,否则它将被折叠。

字符串的可见性转换器:

public class StringToVisiblity : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value is string && value != null)
        {
            if (value.ToString().Trim().Length > 0)
            {
                return Visibility.Visible;
            }
        }
        return Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

我不确定页脚将如何从Gridview 的项目中确定其DataContext。任何建议都会有所帮助。谢谢

【问题讨论】:

  • 你是如何在后面的代码中编写选择器的?您显示或隐藏页脚的逻辑是什么?你能提供给我们MCVE吗?一般来说,您需要在选择器中验证您的 PropertyToShowFooter 属性,以便您的 UI 可以根据您的属性呈现正确的模板。但是,根据您的帖子,您的要求并不清楚。
  • 我用新的代码/细节完全更新了这个问题。请看一看。

标签: c# gridview uwp


【解决方案1】:

页脚必须知道从哪里获取值。如果列表包含多个项目,它无法知道应该使用哪一个。要使页脚模板中的绑定起作用,您必须直接将 Footer 属性设置为它应该使用的实例:

<GridView Footer="{x:Bind TheOneItemTemplateData}"> ... </GridView>

【讨论】:

  • 它有效。我必须将 ItemsControl 的第一项绑定到 footer 属性并且它可以工作。 Visibility="{Binding Items[0].Property, Mode=OneWay, Converter={StaticResource Converter}}"谢谢
  • 很高兴为您提供帮助!编码愉快!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
相关资源
最近更新 更多