微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

UWP GridViewItem 绑定厚度到 ItemIndex

如何解决UWP GridViewItem 绑定厚度到 ItemIndex

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

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

这就是我正在尝试的:

页面.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,string language)
    {
        throw new NotImplementedException();
    }
}

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

非常感谢。

干杯!!!

解决方法

您可以处理可视化树中的 Loaded 事件for the Gridelement in the template and use theVis​​ualTreeHelperclass 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"
        ...
如果您不需要 FindParent<AdaptiveGridView>(grid)

GridViewItem 也可以使用。

,

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

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

XML 代码:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?