【问题标题】:UWP GridViewItem Binding Thicknesss to ItemIndexUWP GridViewItem 绑定厚度到 ItemIndex
【发布时间】:2021-04-14 19:07:56
【问题描述】:

我有一个带有 ItemTemplate 的 AdaptiveGridView 控件,它由一个 Grid 组成,该 Grid 包含一个 StackPanel 和一个 Icon 和一个 TextBlock。我想给 GridViewItem 的 ItemTemplate 的每个 Grid 一个不同的厚度。研究如何做到这一点,我发现将厚度参数绑定到 IValueConverter 是最好的方法。问题是当我尝试它时,我收到一条错误消息:

System.InvalidCastException:'无法将'Test.Models.SampleOrder'类型的对象转换为'Windows.UI.Xaml.Controls.GridViewItem'类型。'

这就是我正在尝试的:

Page.xaml

<Page.Resources>
    <converter:IndexToBorderThicknessConverter x:Name="indexconverter"/>
</Page.Resources>

<Grid x:Name="ContentArea" VerticalAlignment="Center">
    <controls:AdaptiveGridView
        ItemsSource="{x:Bind ViewModel.Source,Mode=OneWay}"
        <controls:AdaptiveGridView.ItemTemplate>
            <DataTemplate x:DataType="models:SampleOrder">
                <Grid
                    x:Name="itemThumbnail"  
                    BorderBrush="Gray"
                    BorderThickness="{Binding Converter={StaticResource indexconverter}}"
                    Padding="{StaticResource XSmallLeftTopRightBottomMargin}"
                    Background="White">
                    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
                        <FontIcon Glyph="{x:Bind Symbol}" />
                        <TextBlock
                            Margin="{StaticResource XXSmallTopMargin}"
                            HorizontalAlignment="Center"
                            Style="{ThemeResource BodyTextStyle}"
                            Text="{x:Bind Company}" />
                    </StackPanel>
                </Grid>
            </DataTemplate>
        </controls:AdaptiveGridView.ItemTemplate>
    </controls:AdaptiveGridView>
</Grid>

IndexToBorderThicknessConverter.cs

public class IndexToBorderThicknessConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        GridViewItem item = (GridViewItem)value;
        AdaptiveGridView gridView = ItemsControl.ItemsControlFromItemContainer(item) as AdaptiveGridView;
        int index = gridView.Items.IndexOf(item);
        Thickness thickness;
        if (index % 2 == 0)
        {
            thickness = new Thickness(1);
        }

        thickness = new Thickness(2);

        return thickness;
    }

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

我可以看到发送给转换器的是 SampleOrder 的模型,而不是 GridViewItem。所以我的问题是:如何发送 SampleOrder 的 GridViewItem 或如何从 SampleOrderSent 获取 GridViewItem?

非常感谢。

干杯!!!

【问题讨论】:

    标签: gridview uwp ivalueconverter


    【解决方案1】:

    您可以在可视化树中处理Loaded eventfor theGridelement in the template and use theVisualTreeHelperclass to find the parentGridViewItem`,而不是使用转换器:

    private void itemThumbnail_Loaded(object sender, RoutedEventArgs e)
    {
        Grid grid = (Grid)sender;
        GridViewItem item = FindParent<GridViewItem>(grid);
        AdaptiveGridView gridView = ItemsControl.ItemsControlFromItemContainer(item) as AdaptiveGridView;
        int index = gridView.Items.IndexOf(grid.DataContext);
        grid.BorderThickness = (index % 2 == 0) ? new Thickness(1) : new Thickness(2);
    }
    
    private static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject
    {
        DependencyObject parent = VisualTreeHelper.GetParent(dependencyObject);
        if (parent == null)
            return null;
    
        T parentT = parent as T;
        return parentT ?? FindParent<T>(parent);
    }
    

    XAML:

    <DataTemplate>
        <Grid
            x:Name="itemThumbnail"
            Loaded="itemThumbnail_Loaded"
            ...
    

    如果您不需要GridViewItemFindParent&lt;AdaptiveGridView&gt;(grid) 也可以使用。

    【讨论】:

      【解决方案2】:

      不得不说,通过converter中的pass值获取gridviewItem很难。

      我建议您可以尝试另一种方法,您可以设置一个名为 Ness 的属性,该属性绑定到BorderThickness,然后在其 get 方法中编写逻辑。这样你就可以直接得到你期望的绑定值了。

      Xaml 代码:

      <Grid  x:Name="itemThumbnail"  BorderBrush="Gray" BorderThickness="{x:Bind Ness}" Background="White">
      

      后面的代码:

      public sealed partial class MainPage : Page
          {
              public static int index = 0;
              ……
      }
      public class SampleOrder
          {      
              private Thickness ness;
              public Thickness Ness
              {
                  get
                  {
                      if (MainPage.index % 2 == 0)
                      {
                          ness = new Thickness(1);
                      }
                      else
                      {
                          ness = new Thickness(3);
                      }
                      MainPage.index++;
                      return ness;
                  }
              }        
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-20
        • 2010-12-26
        • 1970-01-01
        • 2017-07-18
        • 1970-01-01
        • 1970-01-01
        • 2019-07-08
        相关资源
        最近更新 更多