【问题标题】:UWP: Hide ItemsControl itemsUWP:隐藏项目控制项目
【发布时间】:2016-05-13 08:15:47
【问题描述】:

我在另一个 ItemsControl 中有一个 ItemsControl。此 ItemsControl 包含已售商品的列表。

我想显示那些以低于成本(负利润)销售的商品。 但我在折叠项目(行)时遇到问题。

<ItemsControl>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
                ...
                ...
                ...
                <ItemsControl ItemsSource="{Binding SoldItems}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <Grid>  <!--If I hide the grid, it will create empty space.-->
                                ...
                                ...
                                ...
                                <TextBlock Text="{Binding Profit}"></TextBlock>
                            </Grid>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

如果我试图隐藏网格,它会显示空行。它看起来很奇怪,因为那里有空白。

<Grid Visibility="{Binding Profit, Mode=OneWay, Converter={StaticResource ProfitVisibilityConverter}}">

知道如何隐藏整行吗?

谢谢

【问题讨论】:

  • 你能用 Listbox 代替 ItemsControl。恐怕使用 itemscontrol 除了删除不需要的项目之外,您别无选择。如果您可以使用 ListBox,我可以为您提供解决方案
  • 是的,我可以使用列表框...你能帮帮我吗? :)
  • 其实你可以使用 ItemsControl。我找到了其他解决方案。好的,我会发布答案。
  • 嘿,只是想检查是否有其他人找到比接受的答案更好的方法

标签: win-universal-app itemscontrol windows-10-universal listbox-control


【解决方案1】:
<ListView x:Name="MyListView">
    <ListView.ItemTemplate>
        <DataTemplate >
            <Grid Visibility="{Binding visible}"  Tag="{Binding ElementName=MyListView}" Loaded="Grid_Loaded"  >
                <TextBlock Text="{Binding Name}"/>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

private void Grid_Loaded(object sender, RoutedEventArgs e)
{
    Grid grid = sender as Grid;
    // For items control
    // ContentPresenter item = (ContentPresenter)(grid.Tag as ItemsControl).ContainerFromItem(grid.DataContext);
    ListViewItem item = (ListViewItem)(grid.Tag as ItemsControl).ContainerFromItem(grid.DataContext);
    // Or you can directly access listview
    // ListViewItem item = (ListViewItem)(MyListView as ItemsControl).ContainerFromItem(grid.DataContext);
    if ((grid.DataContext as Test).visible == Visibility.Collapsed)
    {
        if (item != null)
        {
            Binding binding = new Binding();
            binding.Mode = BindingMode.TwoWay;
            binding.Source = (grid.DataContext as your model class)
            binding.Path = new PropertyPath("givevisibilityproperty");

            // Attach the binding to the target.
            item.SetBinding(ListViewItem.VisibilityProperty, binding);

            // (item ).Visibility = Visibility.Collapsed;
        }
    }
}

【讨论】:

  • 您好 LovetoCode,我尝试了您的解决方案,但“grid.Tag”为空。有什么想法吗?
  • 嗨 Lovetocode,谢谢!有用!但是,当字段更新(利润变为正)时,它不会再次调用 Grid_Loaded。有什么想法吗?
  • 它不会调用。加载网格时只会调用一次。你没有提到这个要求,所以我给了你这个解决方案
  • 感谢 LovetoCode,我会将这篇文章标记为答案(直到有更好的解决方案)。如果您确实找到了解决方案,请发布解决方案。谢谢:)
  • 有没有人告诉过你你是个天才?有效!!!谢谢朋友,非常感谢您的帮助:)
猜你喜欢
  • 2018-01-17
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-02
  • 2014-10-08
  • 2020-06-09
  • 1970-01-01
相关资源
最近更新 更多