【问题标题】:ContainerFromItem() to select GridViewItem from bound objectContainerFromItem() 从绑定对象中选择 GridViewItem
【发布时间】:2019-07-08 02:25:21
【问题描述】:

我有一个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>

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

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;

这是我的问题。在我们的程序中实现的另一种方法(返回int 值的集合)只抛出Id。如果此方法返回,例如 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;
}

【问题讨论】:

    标签: c# xaml gridview uwp


    【解决方案1】:

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

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

    我刚刚根据你上面的代码sn-p给你做了一个代码示例。

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

    【讨论】:

      【解决方案2】:

      您为什么不通过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
          }
      }
      

      【讨论】:

      • 我愿意,但是有没有其他方法可以直接访问这些项目?我可以循环一百次只选择两个。
      猜你喜欢
      • 2012-04-08
      • 1970-01-01
      • 2016-09-20
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 2016-06-26
      相关资源
      最近更新 更多