ContainerFromItem () для выбора GridViewItem из связанного объекта - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть 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: int и Description: 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;

Вот моя проблема.Другой метод (который возвращает коллекцию значений int), реализованный в нашей программе, выбрасывает только Id.Если этот метод возвращает, например, new int[] { 2, 3 }, как я могу получить объекты GridViewItem, связанные с Orange и Banana?Вот что я дошел до сих пор, но безрезультатно:

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

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

В общем, если вы знаете, как использовать привязку для вашего 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);
}
0 голосов
/ 14 февраля 2019

Почему бы вам не перечислить через свойство 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...