ContainerFromItem() 到 select 来自绑定对象的 GridViewItem

ContainerFromItem() to select GridViewItem from bound object

我有一个 GridView 模板设置如下:

<GridView.ItemTemplate>
    <DataTemplate x:DataType="models:SampleModel">
        <Grid Height="112" Padding="12" Width="227">
            <TextBlock HorizontalAlignment="Center"
                        Text="{x:Bind Description}"/>
        </Grid>
    </DataTemplate>
</GridView.ItemTemplate>

SampleModelclass只有两个属性,Id: intDescription: string。 GridView 现在绑定到 SampleModel 类型的列表。像这样:

var list = new List<SampleModel>
{
    new SampleModel { Id = 1, Description = "Apple" },
    new SampleModel { Id = 2, Description = "Orange" },
    new SampleModel { Id = 3, Description = "Banana" }
};
MyGridView.ItemsSource = list;

这是我的问题。在我们的程序中实现的另一种方法(returns int 值的集合)仅抛出 Id。如果此方法 returns,例如 new int[] { 2, 3 },我如何获得绑定到 Orange 和 Banana 的 GridViewItem 对象?到目前为止,这是我提出的,但无济于事:

var source = MyGridView.DataContext as List<SampleModel>;
foreach (var id in new int[] { 2, 3 })
{
    var fruit = source.FirstOrDefault(a => a.Id == id);
    GridViewItem gvi = MyGridView.ContainerFromItem(fruit) as GridViewItem;
    gvi.IsSelected = true;
}

为什么不枚举 Items 属性,其中包含您添加到 GridView 的所有项目?

喜欢:

for (int i = 0; i < MyGridView.Items.Count; i++)
{
    if(MyGridView.Items[i] is SampleModel item && (item.ID == 2 || item.ID == 3))
    {
        var gridViewItem = MyGridView.ContainerFromItem(item);
        /// do something with this GridViewItem
    }
}

一般来说,如果您知道为 GridView 使用绑定来显示数据,那么您应该也知道绑定可以为您做大部分事情。在您的情况下,毫无疑问,绑定也可以帮助您实现目标。

您只需声明一个额外的 属性 作为每个项目的背景。然后,您可以使用 linq 语句从集合中查找特定项目并更改其 属性 值。

我只是根据您上面的代码片段为您制作了一个代码示例。

<GridView x:Name="MyGridView" ItemsSource="{x:Bind list}">
        <GridView.ItemTemplate>
            <DataTemplate x:DataType="local:SampleModel">
                <Grid Height="112" Padding="12" Width="227" Background="{x:Bind ItemBackground,Mode=OneWay}">
                    <TextBlock HorizontalAlignment="Center"
                    Text="{x:Bind Description}"/>
                </Grid>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>
public class SampleModel:INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged(string PropertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this,new PropertyChangedEventArgs(PropertyName));
        }
    }

    private int _Id;
    public int Id
    {
        get => _Id;
        set
        {
            if (_Id != value)
            {
                _Id = value;
                RaisePropertyChanged("Id");
            }
        }
    }

    private string _Description;

    public string Description
    {
        get =>_Description;
        set
        {
            if (_Description != value)
            {
                _Description = value;
                RaisePropertyChanged("Description");
            }
        }
    }

    private SolidColorBrush _ItemBackground = new SolidColorBrush(Colors.Transparent);
    public SolidColorBrush ItemBackground
    {
        get => _ItemBackground;
        set
        {
            if (_ItemBackground !=value)
            {
                _ItemBackground = value;
                RaisePropertyChanged("ItemBackground");
            }
        }
    }
}
private ObservableCollection<SampleModel> list { get; set; }
    public MainPage()
    {
        this.InitializeComponent();
        list = new ObservableCollection<SampleModel>
{
new SampleModel { Id = 1, Description = "Apple" },
new SampleModel { Id = 2, Description = "Orange" },
new SampleModel { Id = 3, Description = "Banana" }
}; 
    }
var tem_list = list.Where(x => x.Id == 1|| x.Id == 2).ToList();
foreach (var item in tem_list)
{
     item.ItemBackground = new SolidColorBrush(Colors.LightYellow);
}