none
Как программно "дотянуться" до ItemsPanelTemplate RRS feed

  • Вопрос

  • <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <Grid x:Name="ipGrid"/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel>

    "ipGrid" должен содержать сотни столбцов и строк. Заставить грид создавать их автоматически я не смог,

    пытаюсь хотя бы программно напихать туда нужное кол-во Row и Column Definition, но студия пишет, что "ipGrid"

    не существует в текущем контексте. Можно это как-то обойти?

    8 августа 2016 г. 21:40

Ответы

  • Наверное один из самых простых способов использование Attached свойств 

    public sealed partial class MainPage : Page
        {
            public static ObservableCollection<Item> items = new ObservableCollection<Item>
                {
                new Item { Col = 0, Row = 0, CSpan = 2, Name = "item0" },
                new Item { Col = 0, Row = 1, CSpan = 1, Name = "item1" },
                new Item { Col = 1, Row = 1, CSpan = 1, Name = "item2" },
                new Item { Col = 0, Row = 2, CSpan = 2, Name = "item3" },
                new Item { Col = 0, Row = 3, CSpan = 1, Name = "item4" },
                new Item { Col = 1, Row = 3, CSpan = 1, Name = "item5" },
                new Item { Col = 0, Row = 4, CSpan = 2, Name = "item6" },
                new Item { Col = 1, Row = 5, CSpan = 1, Name = "item7" },
                new Item { Col = 2, Row = 5, CSpan = 1, Name = "item8" },
                new Item { Col = 3, Row = 6, CSpan = 1, Name = "item9" },
                };
    
            public MainPage()
            {
                this.InitializeComponent();
                iCon.ItemsSource = items;
            }
        }
    
        public class GridUtils: DependencyObject
        {
            public static bool GetColumnsAndRowsAtRunTime(DependencyObject obj)
            {
                return (bool)obj.GetValue(ColumnsAndRowsAtRunTimeProperty);
            }
    
            public static void SetColumnsAndRowsAtRunTime(DependencyObject obj, bool value)
            {
                obj.SetValue(ColumnsAndRowsAtRunTimeProperty, value);
            }
    
            public static readonly DependencyProperty ColumnsAndRowsAtRunTimeProperty =
                DependencyProperty.RegisterAttached("ColumnsAndRowsAtRunTime", typeof(bool), typeof(Grid), new PropertyMetadata(0, OnColumnsAndRowsAtRunTimeChanged));
    
            private static void OnColumnsAndRowsAtRunTimeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                Grid grid = d as Grid;
                grid.LayoutUpdated += (s, e2) =>
                {
                    CallBack(grid);
                };
    
            }
    
            private static void CallBack(Grid grid)
            {
                var childCount = grid.Children.Count;
                var items = MainPage.items;
                var rowCount = items.Max(x => x.Row)+1;
                var colCount = items.Max(x => x.Col)+1;
    
                int rowsToAdd = rowCount - grid.RowDefinitions.Count;
    
                for (int row = 0; row < rowsToAdd; row++)
                {
                    grid.RowDefinitions.Add(new RowDefinition());
                }
    
    
                int colToAdd = colCount - grid.ColumnDefinitions.Count;
    
                for (int col = 0; col < rowsToAdd; col++)
                {
                    grid.ColumnDefinitions.Add(new ColumnDefinition());
                }
                if (!(colToAdd == 0 || rowsToAdd == 0))
                {
                    for (int i = 0; i < childCount; i++)
                    {
                        var child = grid.Children[i] as FrameworkElement;
                        var row = (child.DataContext as Item).Row;
                        var col = (child.DataContext as Item).Col;
                        var colSpan = (child.DataContext as Item).CSpan;
                        Grid.SetRow(child, row);
                        Grid.SetColumn(child, col);
                        Grid.SetColumnSpan(child, colSpan);
                    }
                }
            }
        }
        <ItemsControl x:Name="iCon"  Height="350" Width="525">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Grid local:GridUtils.ColumnsAndRowsAtRunTime="true"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Button Content ="{Binding Name}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

    результат следующий 


    НО ЭТО ПЛОХАЯ ПРАКТИКА ЛУЧШЕ ИСПОЛЬЗУЙТЕ VariableSizedWrapGrid . КАК ИСПОЛЬЗОВАТЬ? ПОСМОТРИТЕ ЗДЕСЬ 

    Windows 8 Beauty Tip: Using a VariableSizedWrapGrid in a GridView makes Grids Prettier

    • Помечено в качестве ответа CheeGer 10 августа 2016 г. 19:21
    10 августа 2016 г. 13:10
  • Начиная с Windows 8 DataBinding в стилях не работает, чтобы обойте это ограничение надо использовать C# . Внизу представлен полный код для UWP и он работаек также как у вас в WPF работал .

     public sealed partial class MainPage : Page
        {
            public ObservableCollection<Item> items = new ObservableCollection<Item>
                {
                new Item { Col = 0, Row = 0, CSpan = 2, Name = "item0" },
                new Item { Col = 0, Row = 1, CSpan = 1, Name = "item1" },
                new Item { Col = 1, Row = 1, CSpan = 1, Name = "item2" },
                };
    
            public MainPage()
            {
                this.InitializeComponent();
                iCon.ItemsSource = items;
            }
        }
    
        public class MyItemsControl : ItemsControl
        {
            protected override void PrepareContainerForItemOverride(Windows.UI.Xaml.DependencyObject element, object item)
            {
                base.PrepareContainerForItemOverride(element, item);
                ContentPresenter controlItem = element as ContentPresenter;
    
                Binding bindingRow = new Binding();
                bindingRow.Mode = BindingMode.TwoWay;
                bindingRow.Source = item;
                bindingRow.Path = new PropertyPath("Row");
                controlItem.SetBinding(Grid.RowProperty, bindingRow);
    
                Binding bindingCol = new Binding();
                bindingCol.Mode = BindingMode.TwoWay;
                bindingCol.Source = item;
                bindingCol.Path = new PropertyPath("Col");
                controlItem.SetBinding(Grid.ColumnProperty, bindingCol);
    
                Binding bindingCSpan = new Binding();
                bindingCSpan.Mode = BindingMode.TwoWay;
                bindingCSpan.Source = item;
                bindingCSpan.Path = new PropertyPath("CSpan");
                controlItem.SetBinding(Grid.ColumnSpanProperty, bindingCSpan);
            }
        }

    <local:MyItemsControl x:Name="iCon"  Height="350" Width="525">
            <local:MyItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                    </Grid>
                </ItemsPanelTemplate>
            </local:MyItemsControl.ItemsPanel>
    
            <local:MyItemsControl.ItemTemplate>
                <DataTemplate>
                    <Button Content ="{Binding Name}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
                </DataTemplate>
            </local:MyItemsControl.ItemTemplate>
        </local:MyItemsControl>
    Так же подумайте использовать  GridView с  VariableSizedWrapGrid.

    • Изменено Azat Tazayan 9 августа 2016 г. 15:58
    • Помечено в качестве ответа CheeGer 10 августа 2016 г. 19:20
    9 августа 2016 г. 15:55
  •  if (!(colToAdd == 0 || rowsToAdd == 0))
                {
                    for (int i = 0; i < childCount; i++)
                    {
                        var child = grid.Children[i] as FrameworkElement;
                        var row = (child.DataContext as Item).Row;
                        var col = (child.DataContext as Item).Col;
                        var colSpan = (child.DataContext as Item).CSpan;
                        Grid.SetRow(child, row);
                        Grid.SetColumn(child, col);
                        Grid.SetColumnSpan(child, colSpan);
                    }
                }

    Я правильно понимаю, что данный блок будет переписывать row, col и colSpan у всех элементов при каждом добавлении нового. Вариант с привязкой не шустрее?     

    Да именно так и обойти это можно следующим образом нужно переопределить 

    PrepareContainerForItemOverride для ItemsControl

     public class GridUtils : DependencyObject
        {
            public static bool GetColumnsAndRowsAtRunTime(DependencyObject obj)
            {
                return (bool)obj.GetValue(ColumnsAndRowsAtRunTimeProperty);
            }
    
            public static void SetColumnsAndRowsAtRunTime(DependencyObject obj, bool value)
            {
                obj.SetValue(ColumnsAndRowsAtRunTimeProperty, value);
            }
    
            public static readonly DependencyProperty ColumnsAndRowsAtRunTimeProperty =
                DependencyProperty.RegisterAttached("ColumnsAndRowsAtRunTime", typeof(bool), typeof(Grid), new PropertyMetadata(0, OnColumnsAndRowsAtRunTimeChanged));
    
            private static void OnColumnsAndRowsAtRunTimeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                Grid grid = d as Grid;
                grid.LayoutUpdated += (s, e2) =>
                {
                    CallBack(grid);
                };
    
            }
    
            private static void CallBack(Grid grid)
            {
                var childCount = grid.Children.Count;
                var items = MainPage.items;
                var rowCount = items.Max(x => x.Row) + 1;
                var colCount = items.Max(x => x.Col) + 1;
    
                int rowsToAdd = rowCount - grid.RowDefinitions.Count;
    
                for (int row = 0; row < rowsToAdd; row++)
                {
                    grid.RowDefinitions.Add(new RowDefinition());
                }
    
    
                int colToAdd = colCount - grid.ColumnDefinitions.Count;
    
                for (int col = 0; col < rowsToAdd; col++)
                {
                    grid.ColumnDefinitions.Add(new ColumnDefinition());
                }
            }
        }
    
        public class MyItemsControl : ItemsControl
        {
            protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
            {
                try
                {
                    dynamic _Item = item;
                    element.SetValue(Grid.RowProperty, _Item.Row);
                    element.SetValue(Grid.ColumnProperty, _Item.Col);
                    element.SetValue(Grid.ColumnSpanProperty, _Item.CSpan);
                }
                catch (Exception)
                {
                    element.SetValue(Grid.RowProperty, 1);
                    element.SetValue(Grid.ColumnProperty, 1);
                    element.SetValue(Grid.ColumnSpanProperty, 1);
                }
                finally
                {
                    base.PrepareContainerForItemOverride(element, item);
                }
            }
    
        }
    <local:MyItemsControl x:Name="iCon"  Height="350" Width="525">
          <local:MyItemsControl.ItemsPanel>
              <ItemsPanelTemplate>
                 <Grid local:GridUtils.ColumnsAndRowsAtRunTime="true"/>
              </ItemsPanelTemplate>
          </local:MyItemsControl.ItemsPanel>
          <local:MyItemsControl.ItemTemplate>
               <DataTemplate>
                  <Button Content ="{Binding Name}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
               </DataTemplate>
          </local:MyItemsControl.ItemTemplate>
    </local:MyItemsControl>


    • Помечено в качестве ответа CheeGer 10 августа 2016 г. 19:19
    10 августа 2016 г. 17:33

Все ответы

  •  Добры день,

    А почему вы не хотите использовать GridView . опешите вышу проблему целиком может мы более лучшее решение предложим 


    • Изменено Azat Tazayan 9 августа 2016 г. 9:30
    9 августа 2016 г. 8:48
  • Я не знаю как реализовать древовидный грид с помощью GridView.

    Тут полный код приложения, которое я пытаюсь масштабировать. 

     
    9 августа 2016 г. 14:20
  • Начиная с Windows 8 DataBinding в стилях не работает, чтобы обойте это ограничение надо использовать C# . Внизу представлен полный код для UWP и он работаек также как у вас в WPF работал .

     public sealed partial class MainPage : Page
        {
            public ObservableCollection<Item> items = new ObservableCollection<Item>
                {
                new Item { Col = 0, Row = 0, CSpan = 2, Name = "item0" },
                new Item { Col = 0, Row = 1, CSpan = 1, Name = "item1" },
                new Item { Col = 1, Row = 1, CSpan = 1, Name = "item2" },
                };
    
            public MainPage()
            {
                this.InitializeComponent();
                iCon.ItemsSource = items;
            }
        }
    
        public class MyItemsControl : ItemsControl
        {
            protected override void PrepareContainerForItemOverride(Windows.UI.Xaml.DependencyObject element, object item)
            {
                base.PrepareContainerForItemOverride(element, item);
                ContentPresenter controlItem = element as ContentPresenter;
    
                Binding bindingRow = new Binding();
                bindingRow.Mode = BindingMode.TwoWay;
                bindingRow.Source = item;
                bindingRow.Path = new PropertyPath("Row");
                controlItem.SetBinding(Grid.RowProperty, bindingRow);
    
                Binding bindingCol = new Binding();
                bindingCol.Mode = BindingMode.TwoWay;
                bindingCol.Source = item;
                bindingCol.Path = new PropertyPath("Col");
                controlItem.SetBinding(Grid.ColumnProperty, bindingCol);
    
                Binding bindingCSpan = new Binding();
                bindingCSpan.Mode = BindingMode.TwoWay;
                bindingCSpan.Source = item;
                bindingCSpan.Path = new PropertyPath("CSpan");
                controlItem.SetBinding(Grid.ColumnSpanProperty, bindingCSpan);
            }
        }

    <local:MyItemsControl x:Name="iCon"  Height="350" Width="525">
            <local:MyItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                    </Grid>
                </ItemsPanelTemplate>
            </local:MyItemsControl.ItemsPanel>
    
            <local:MyItemsControl.ItemTemplate>
                <DataTemplate>
                    <Button Content ="{Binding Name}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
                </DataTemplate>
            </local:MyItemsControl.ItemTemplate>
        </local:MyItemsControl>
    Так же подумайте использовать  GridView с  VariableSizedWrapGrid.

    • Изменено Azat Tazayan 9 августа 2016 г. 15:58
    • Помечено в качестве ответа CheeGer 10 августа 2016 г. 19:20
    9 августа 2016 г. 15:55
  • Спасибо большое, попробую через С# А как всётаки быть с расширением грида?
    9 августа 2016 г. 16:44
  • Наверное один из самых простых способов использование Attached свойств 

    public sealed partial class MainPage : Page
        {
            public static ObservableCollection<Item> items = new ObservableCollection<Item>
                {
                new Item { Col = 0, Row = 0, CSpan = 2, Name = "item0" },
                new Item { Col = 0, Row = 1, CSpan = 1, Name = "item1" },
                new Item { Col = 1, Row = 1, CSpan = 1, Name = "item2" },
                new Item { Col = 0, Row = 2, CSpan = 2, Name = "item3" },
                new Item { Col = 0, Row = 3, CSpan = 1, Name = "item4" },
                new Item { Col = 1, Row = 3, CSpan = 1, Name = "item5" },
                new Item { Col = 0, Row = 4, CSpan = 2, Name = "item6" },
                new Item { Col = 1, Row = 5, CSpan = 1, Name = "item7" },
                new Item { Col = 2, Row = 5, CSpan = 1, Name = "item8" },
                new Item { Col = 3, Row = 6, CSpan = 1, Name = "item9" },
                };
    
            public MainPage()
            {
                this.InitializeComponent();
                iCon.ItemsSource = items;
            }
        }
    
        public class GridUtils: DependencyObject
        {
            public static bool GetColumnsAndRowsAtRunTime(DependencyObject obj)
            {
                return (bool)obj.GetValue(ColumnsAndRowsAtRunTimeProperty);
            }
    
            public static void SetColumnsAndRowsAtRunTime(DependencyObject obj, bool value)
            {
                obj.SetValue(ColumnsAndRowsAtRunTimeProperty, value);
            }
    
            public static readonly DependencyProperty ColumnsAndRowsAtRunTimeProperty =
                DependencyProperty.RegisterAttached("ColumnsAndRowsAtRunTime", typeof(bool), typeof(Grid), new PropertyMetadata(0, OnColumnsAndRowsAtRunTimeChanged));
    
            private static void OnColumnsAndRowsAtRunTimeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                Grid grid = d as Grid;
                grid.LayoutUpdated += (s, e2) =>
                {
                    CallBack(grid);
                };
    
            }
    
            private static void CallBack(Grid grid)
            {
                var childCount = grid.Children.Count;
                var items = MainPage.items;
                var rowCount = items.Max(x => x.Row)+1;
                var colCount = items.Max(x => x.Col)+1;
    
                int rowsToAdd = rowCount - grid.RowDefinitions.Count;
    
                for (int row = 0; row < rowsToAdd; row++)
                {
                    grid.RowDefinitions.Add(new RowDefinition());
                }
    
    
                int colToAdd = colCount - grid.ColumnDefinitions.Count;
    
                for (int col = 0; col < rowsToAdd; col++)
                {
                    grid.ColumnDefinitions.Add(new ColumnDefinition());
                }
                if (!(colToAdd == 0 || rowsToAdd == 0))
                {
                    for (int i = 0; i < childCount; i++)
                    {
                        var child = grid.Children[i] as FrameworkElement;
                        var row = (child.DataContext as Item).Row;
                        var col = (child.DataContext as Item).Col;
                        var colSpan = (child.DataContext as Item).CSpan;
                        Grid.SetRow(child, row);
                        Grid.SetColumn(child, col);
                        Grid.SetColumnSpan(child, colSpan);
                    }
                }
            }
        }
        <ItemsControl x:Name="iCon"  Height="350" Width="525">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Grid local:GridUtils.ColumnsAndRowsAtRunTime="true"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Button Content ="{Binding Name}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

    результат следующий 


    НО ЭТО ПЛОХАЯ ПРАКТИКА ЛУЧШЕ ИСПОЛЬЗУЙТЕ VariableSizedWrapGrid . КАК ИСПОЛЬЗОВАТЬ? ПОСМОТРИТЕ ЗДЕСЬ 

    Windows 8 Beauty Tip: Using a VariableSizedWrapGrid in a GridView makes Grids Prettier

    • Помечено в качестве ответа CheeGer 10 августа 2016 г. 19:21
    10 августа 2016 г. 13:10
  • Спасибо.. Понимаю, что плохая - я и начинал изначально с обычного грида без ItemsSource, но все это очень геморно обновлялось и жутко тормозило. По этому и решил прикрутить ItemsControl, а от VariableSizedWrapGrid отказался, потому что там нет прокрутки по вертикали и позиционирования элементов по заданным координатам. Пока лучше ничего найти не смог.

          
    10 августа 2016 г. 14:47
  •  if (!(colToAdd == 0 || rowsToAdd == 0))
                {
                    for (int i = 0; i < childCount; i++)
                    {
                        var child = grid.Children[i] as FrameworkElement;
                        var row = (child.DataContext as Item).Row;
                        var col = (child.DataContext as Item).Col;
                        var colSpan = (child.DataContext as Item).CSpan;
                        Grid.SetRow(child, row);
                        Grid.SetColumn(child, col);
                        Grid.SetColumnSpan(child, colSpan);
                    }
                }

    Я правильно понимаю, что данный блок будет переписывать row, col и colSpan у всех элементов при каждом добавлении нового. Вариант с привязкой не шустрее?     

    10 августа 2016 г. 16:03
  •  if (!(colToAdd == 0 || rowsToAdd == 0))
                {
                    for (int i = 0; i < childCount; i++)
                    {
                        var child = grid.Children[i] as FrameworkElement;
                        var row = (child.DataContext as Item).Row;
                        var col = (child.DataContext as Item).Col;
                        var colSpan = (child.DataContext as Item).CSpan;
                        Grid.SetRow(child, row);
                        Grid.SetColumn(child, col);
                        Grid.SetColumnSpan(child, colSpan);
                    }
                }

    Я правильно понимаю, что данный блок будет переписывать row, col и colSpan у всех элементов при каждом добавлении нового. Вариант с привязкой не шустрее?     

    Да именно так и обойти это можно следующим образом нужно переопределить 

    PrepareContainerForItemOverride для ItemsControl

     public class GridUtils : DependencyObject
        {
            public static bool GetColumnsAndRowsAtRunTime(DependencyObject obj)
            {
                return (bool)obj.GetValue(ColumnsAndRowsAtRunTimeProperty);
            }
    
            public static void SetColumnsAndRowsAtRunTime(DependencyObject obj, bool value)
            {
                obj.SetValue(ColumnsAndRowsAtRunTimeProperty, value);
            }
    
            public static readonly DependencyProperty ColumnsAndRowsAtRunTimeProperty =
                DependencyProperty.RegisterAttached("ColumnsAndRowsAtRunTime", typeof(bool), typeof(Grid), new PropertyMetadata(0, OnColumnsAndRowsAtRunTimeChanged));
    
            private static void OnColumnsAndRowsAtRunTimeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                Grid grid = d as Grid;
                grid.LayoutUpdated += (s, e2) =>
                {
                    CallBack(grid);
                };
    
            }
    
            private static void CallBack(Grid grid)
            {
                var childCount = grid.Children.Count;
                var items = MainPage.items;
                var rowCount = items.Max(x => x.Row) + 1;
                var colCount = items.Max(x => x.Col) + 1;
    
                int rowsToAdd = rowCount - grid.RowDefinitions.Count;
    
                for (int row = 0; row < rowsToAdd; row++)
                {
                    grid.RowDefinitions.Add(new RowDefinition());
                }
    
    
                int colToAdd = colCount - grid.ColumnDefinitions.Count;
    
                for (int col = 0; col < rowsToAdd; col++)
                {
                    grid.ColumnDefinitions.Add(new ColumnDefinition());
                }
            }
        }
    
        public class MyItemsControl : ItemsControl
        {
            protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
            {
                try
                {
                    dynamic _Item = item;
                    element.SetValue(Grid.RowProperty, _Item.Row);
                    element.SetValue(Grid.ColumnProperty, _Item.Col);
                    element.SetValue(Grid.ColumnSpanProperty, _Item.CSpan);
                }
                catch (Exception)
                {
                    element.SetValue(Grid.RowProperty, 1);
                    element.SetValue(Grid.ColumnProperty, 1);
                    element.SetValue(Grid.ColumnSpanProperty, 1);
                }
                finally
                {
                    base.PrepareContainerForItemOverride(element, item);
                }
            }
    
        }
    <local:MyItemsControl x:Name="iCon"  Height="350" Width="525">
          <local:MyItemsControl.ItemsPanel>
              <ItemsPanelTemplate>
                 <Grid local:GridUtils.ColumnsAndRowsAtRunTime="true"/>
              </ItemsPanelTemplate>
          </local:MyItemsControl.ItemsPanel>
          <local:MyItemsControl.ItemTemplate>
               <DataTemplate>
                  <Button Content ="{Binding Name}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
               </DataTemplate>
          </local:MyItemsControl.ItemTemplate>
    </local:MyItemsControl>


    • Помечено в качестве ответа CheeGer 10 августа 2016 г. 19:19
    10 августа 2016 г. 17:33
  • Ещё раз спасибо за помощь, так компетентно и оперативно мне ещё никто не отвечал.

    Напоследок можете пояснить про PrepareContainerForItemOverride(не могу найти нормальную документацию по этому методу), я правильно понимаю что повторно(после запуска приложения) он выполняется только для измененных и добавленных элементов? И почему при исключении у Вас всем свойствам присваивается 1 и вообще зачем там try-catch? 

       
    11 августа 2016 г. 0:22