locked
ItemsSource для Grid RRS feed

  • Общие обсуждения

  • Есть древовидный Grid и DataTemplate объявленный в ресурсах страницы, ну и коллекция объектов..

    Сейчас приходится заполнять темплиты из коллекции и аттачить к ним координаты через Grid.SetColumn

    и Grid.SetRow чтобы добавить их в грид через Children.Add.. это ещё куда ни шло, но вот при удалении и изменении

    начинается настоящий геморрой..

    Нельзя ли как-то этого избежать, допустим прикрутив к гриду некий аналог ItemsSource для GridView, чтоб грид сам обновлялся при изменении коллекции?       

          
    17 апреля 2016 г. 16:56

Все ответы

  • Добрый день.

    А что вам мешает указать Grid в качестве ItemsPanel у ItemsControl (у которого есть ItemSource)?

    Правда размещение элементов придеться делать все равно руками, но зато изменение будет отслеживаться автоматом.

    Что-то вида:

    <ItemsControl ItemsSource="{Binding Cells}" ItemTemplateSelector="{StaticResource RosstatSectionCellTemplateSelector}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Grid attachedProperties:GridHelpers.Columns="{Binding RosstatReportCustomSection.Columns}"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemContainerStyle>
            <Style>
                <Setter Property="Grid.Column" Value="{Binding Index}"/>
            </Style>
        </ItemsControl.ItemContainerStyle>
    </ItemsControl>

    18 апреля 2016 г. 6:34
    Отвечающий
  • Спасибо за совет.. попробовал переразметить как у вас.. выдаёт "object reference not set to an instance of an object" на 

    <Setter Property="Grid.Column" Value="{Binding Index}"/>

    В чём может быть причина?

    21 апреля 2016 г. 14:37
  • У объекта который является элементом коллекции есть свойство Index? Это свойство типа int? В нем есть значение?
    21 апреля 2016 г. 15:09
    Отвечающий
  • Свойство есть.. тип int.. изначально значения нет.. коллекция заполняется из бд при старте.

     Вяжу через x:Bind, хотя с Binding то же самое 

    • Изменено CheeGer 21 апреля 2016 г. 21:49
    21 апреля 2016 г. 21:45
  • Сходу не скажу. Надо посмотреть на код, разметку. Если сможете воспроизвести проблему на тривиальном пример, то скиньте описание.
    22 апреля 2016 г. 5:24
    Отвечающий
  • Если вязать через Binding пишет уже:

    Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))

    Причем жалуется только на привязки внутри стиля.. если привязать то же свойство в другом месте - проблем нет.. и если в сеттере указать конкретное Value вместо привязки - ошибки тоже нет.

    22 апреля 2016 г. 10:31
  • Не видя код, помочь вам, скорее всего, не получится. Попробуйте вочпроизвести эту ситуацию в маленьком тестовом проекте и выложите его исходники на форум.
    22 апреля 2016 г. 10:34
    Отвечающий
  • using System.Collections.ObjectModel;
    using Windows.UI.Xaml.Controls;
    
    namespace App1
    {
        public sealed partial class MainPage : Page
        {
            ObservableCollection<Item> items = new ObservableCollection<Item>();
    
            public MainPage()
            {
                this.InitializeComponent();
                items.Add(new Item { Col = 0, Row = 0, CSpan = 2 });
                items.Add(new Item { Col = 0, Row = 1, CSpan = 1 });
                items.Add(new Item { Col = 1, Row = 1, CSpan = 1 });
            }
        }
    
        public class Item
        {
            private int cSpan;
            public int CSpan
            {
                get { return cSpan; }
                set { cSpan = value; }
            }
    
            private int col;
            public int Col
            {
                get { return col; }
                set { col = value; }
            }
    
            private int row;
            public int Row
            {
                get { return row; }
                set { row = value; }
            }
        }
    }
    <Page
        x:Class="App1.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:App1"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <ItemsControl ItemsSource="{Binding items}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition/>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                    </Grid>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
    
            <ItemsControl.ItemContainerStyle>
                <Style> <!-- Тут выдает: "Style object must specify a String value for the TargetType property" -->
                    <Setter Property="Grid.Column" Value="{Binding Col}" /> <!-- Тут: "Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))" -->
                    <Setter Property="Grid.Row" Value="{Binding Row}" />
                    <Setter Property="Grid.ColumnSpan" Value="{Binding CSpan}" />
                </Style>
            </ItemsControl.ItemContainerStyle>
    
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Button Content="{Binding Name}"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Page>

    • Изменено CheeGer 25 апреля 2016 г. 21:17
    25 апреля 2016 г. 21:14
  • После обновления студии проект всё-таки начал компилиться.. но выдает пока только пустой грид.. Что Вы имели в веду, когда писали, что размещение элементов придется делать все равно руками? 
    16 мая 2016 г. 23:07