Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
3 / 3 / 0
Регистрация: 27.05.2020
Сообщений: 26
WPF

Получить объект из Grid

27.05.2020, 00:56. Показов 7185. Ответов 50
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, направьте пожалуйста куда копать. Третий день бьюсь не могу понять, как мне получить объект при клике мышью на форму с Grid. Пытаюсь сделать по правилам MVVM.
Есть Grid, привязанный к массиву объектов. Как мне при клике на клетку с объектом получить ссылку на этот объект? Гугл с яндексом уже боятся меня, я их задолбал запросами, но ничего похожего найти не могу.
Нужно вывести инфу по объекту находящемуся в клетке Grida куда я кликнул. Инфу то я выведу, но как мне получить объект по клику мыши я никак не могу понять
Мой XAML:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
<Window
    x:Class="EvolutionGrid.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:EvolutionGrid"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:user="clr-namespace:EvolutionGrid.ViewModel"
    Title="Natural selection"
    Width="800"
    Height="450"
    ResizeMode="NoResize"
    ScrollViewer.VerticalScrollBarVisibility="Disabled"
    SizeToContent="WidthAndHeight"
    mc:Ignorable="d">
 
    <Window.DataContext>
        <user:MainWindowViewModel />
    </Window.DataContext>
    
    <Grid>
        <ItemsControl ItemsSource="{Binding WorldMap, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <ItemsControl.Resources>
                <user:TextConverter x:Key="TxtConvert" />
            </ItemsControl.Resources>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <ItemsControl ItemsSource="{Binding UpdateSourceTrigger=PropertyChanged}">
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel IsItemsHost="True" Orientation="Horizontal" />
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <Grid
                                    Width="15"
                                    Height="15"
                                    Margin="1"
                                    Background="WhiteSmoke" MouseDown="Grid_MouseDown">
                                    <Grid Background="{Binding Fill, UpdateSourceTrigger=PropertyChanged}" />
                                    <TextBlock
                                        HorizontalAlignment="Center"
                                        VerticalAlignment="Center"
                                        FontSize="10"
                                        Foreground="White"
                                        Text="{Binding Health, Converter={StaticResource TxtConvert}}" />
                                </Grid>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
        <Button
            Grid.Column="1"
            Width="75"
            Margin="8.4,146,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Command="{Binding ComStart}"
            Content="Старт"
            FontWeight="Bold" />
        <Button
            Grid.Column="1"
            Width="75"
            Margin="117.4,146,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Command="{Binding ComStop}"
            Content="Стоп"
            FontWeight="Bold" />
        <Label
            Grid.Column="1"
            Margin="3.4,11,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Content="Поколение" />
        <Label
            Grid.Column="1"
            Margin="126.4,11,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Content="{Binding Generation, UpdateSourceTrigger=PropertyChanged}" />
        <Label
            Grid.Column="1"
            Margin="126.4,31,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Content="{Binding TimeLife, UpdateSourceTrigger=PropertyChanged}" />
        <Label
            Grid.Column="1"
            Margin="3.4,31,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Content="Время жизни" />
        <Button
            Grid.Column="1"
            Width="20"
            Height="20"
            Margin="172,185,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Command="{Binding ComSpeedPlus}"
            Content="+"
            FontWeight="Bold"
            IsEnabled="{Binding EnableStartButton}"
            ScrollViewer.VerticalScrollBarVisibility="Disabled"
            UseLayoutRounding="False" />
        <Button
            Grid.Column="1"
            Width="20"
            Height="20"
            Margin="106.4,185,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Command="{Binding ComSpeedMinus}"
            Content="-"
            FontWeight="Bold" />
        <TextBox
            Grid.Column="1"
            Width="45"
            Height="20"
            Margin="126.4,185,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            HorizontalContentAlignment="Center"
            VerticalContentAlignment="Center"
            IsEnabled="False"
            Text="{Binding Speed, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
            TextWrapping="Wrap" />
        <Label
            Grid.Column="1"
            Margin="3.4,183,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Content="Скорость"
            FontWeight="Bold" />
 
        <Polyline
            Grid.Row="1"
            Grid.Column="0"
            Width="{Binding ElementName=col0, Path=ActualWidth}"
            Margin="4"
            Points="{Binding Graf, UpdateSourceTrigger=PropertyChanged}"
            RenderTransformOrigin="0.5,0.5"
            Stretch="Fill"
            Stroke="Red"
            StrokeThickness="1" HorizontalAlignment="Left">
            <Polyline.RenderTransform>
                <TransformGroup>
                    <ScaleTransform ScaleX="1" ScaleY="-1" />
                    <SkewTransform AngleX="0" AngleY="0" />
                    <RotateTransform Angle="0" />
                    <TranslateTransform />
                </TransformGroup>
            </Polyline.RenderTransform>
        </Polyline>
        <Label Content="Max время жизни" Grid.Column="1" HorizontalAlignment="Left" Margin="3.4,52,0,0" VerticalAlignment="Top" FontWeight="Bold"/>
        <Label
            Grid.Column="1"
            Margin="126.4,52,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Content="{Binding MaxTimeLife, UpdateSourceTrigger=PropertyChanged}" FontWeight="Bold" />
 
        <Grid.ColumnDefinitions>
            <ColumnDefinition x:Name="col0"/>
            <ColumnDefinition Width="200" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="100" />
        </Grid.RowDefinitions>
    </Grid>
</Window>
Весь проект тут https://github.com/Mobile02/EvolutionGrid

P.S. Сильно не пинайте, я только учусь
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.05.2020, 00:56
Ответы с готовыми решениями:

Возможно ли задать в XAML число строк и столбцов Grid сразу, без исп <Grid.ColumnDefinitions> и <Grid.RowDefinnitions>?
Возможно ли задать в XAML число строк и столбцов Grid сразу, без исп &lt;Grid.ColumnDefinitions&gt; и &lt;Grid.RowDefinnitions&gt;?

Получить элемент из Grid по строке и столбцу
Блин, никак не найду метод возвращающий элемент из Grid по строке и столбцу! Спасайте))) Заранее спасибо

Получить данные о Grid
Почему я не могу получить данные о &quot;Grid&quot; из события &quot;LayoutUpdated&quot; через &quot;sender&quot;? Ошибка: Ссылка на объект не указывает на экземпляр...

50
3 / 3 / 0
Регистрация: 27.05.2020
Сообщений: 26
28.07.2020, 15:42  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Решение на GitHub выложите.
Или, если не умеете пользоваться, сюда архивом.
Там логика толком не работает, в процессе переделки, на нее не смотрите)
https://github.com/Mobile02/NaturalSelection
0
WPF Разработчик
 Аватар для sttrox
463 / 167 / 42
Регистрация: 20.02.2018
Сообщений: 285
28.07.2020, 16:05
Mobile02, источник ссылка
в ItemsControl добавить:
XML
1
2
3
4
5
6
<ItemsControl.ItemContainerStyle>
    <Style>
        <Setter Property="Grid.Row" Value="{Binding PointY}" />
        <Setter Property="Grid.Column" Value="{Binding PointX}" />
    </Style>
</ItemsControl.ItemContainerStyle>
Все остальные Grid.Row и Grid.Column в DataTemplate удалите.
Вы, кстати, допустили в это ошибку, в <DataTemplate DataType="{x:Type user:ViewModelBio}">, Grid.Row надо было указать для Button. Будьте внимательны
2
3 / 3 / 0
Регистрация: 27.05.2020
Сообщений: 26
28.07.2020, 16:11  [ТС]
Цитата Сообщение от sttrox Посмотреть сообщение
Все остальные Grid.Row и Grid.Column в DataTemplate удалите.
Вы, кстати, допустили в это ошибку, в <DataTemplate DataType="{x:Type user:ViewModelBio}">, Grid.Row надо было указать для Button. Будьте внимательны
Спасибо большое!
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
28.07.2020, 16:38
Mobile02!
1) прочитайте пост Присоединённые свойства (Attached Property) для всплывающей привязки из шаблонов данных к Canvas и Grid.
2) разберитесь как добавлять проекты в решение и ссылаться на них.

Проект с исправлениями в архиве.
Вложения
Тип файла: 7z NaturalSelectionRepos.7z (11.8 Кб, 5 просмотров)
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
28.07.2020, 16:41
И сами по себе эти шаблоны вызывают большие сомнения
XML
18
19
20
21
22
23
24
25
26
        <DataTemplate DataType="{x:Type vm:ViewModelWall}">
            <Grid
                ap:Grid.Row="{Binding PointY}"
                ap:Grid.Column="{Binding PointX}"
                Width="15"
                Height="15"
                Margin="1"
                Background="Gray" />
        </DataTemplate>
Зачем в шаблоне пустая панель?

Очень вероятно, что вы выбрали неверный элемент для Представления.

Добавлено через 1 минуту
Несколько шаблонов одинаковых.
Отличаются только цветом.
Надо сделать для них общий базовый тип и цвет переключать триггером.
1
3 / 3 / 0
Регистрация: 27.05.2020
Сообщений: 26
28.07.2020, 16:44  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Зачем в шаблоне пустая панель?
Очень вероятно, что вы выбрали неверный элемент для Представления.
Вероятно) я в wpf еле еле соображаю пока.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Надо сделать для них общий базовый тип и цвет переключать триггером.
Это в планах, как с логикой разберусь.

Спасибо за помощь!
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
28.07.2020, 16:52
Mobile02, в архиве разобрались что к чему?
0
3 / 3 / 0
Регистрация: 27.05.2020
Сообщений: 26
28.07.2020, 16:59  [ТС]
Элд Хасп, Разбираюсь
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
28.07.2020, 18:54
Mobile02,на всякий случай (редактор по-моему ещё не освоили):
При обращении к другому пользователю указывайте его ник в тегах [NICK][/NICK].

Для вставки ника: введите ник, выделите его и нажмите кнопку "Динамик" на панели редактора сообщений.
Или кликните по нику автора сообщения в панели слева от текста его сообщения.
1
3 / 3 / 0
Регистрация: 27.05.2020
Сообщений: 26
29.07.2020, 17:29  [ТС]
Цитата Сообщение от sttrox Посмотреть сообщение
Можно не обновлять весь массив, а обновлять только необходимые ячейки.
Так не хочет работать. Только если создаю новый массив и заново его заполняю, тогда срабатывает обновление. Насколько я нагуглил, массив не вызывает никаких событий при изменении содержимого. Советуют ObservableCollection или BindingList, но им не нравится, что я лезу из другого потока. Да и все равно они тоже не уведомляют View, по крайней мере у меня с ними ничего не получилось.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
public class MainWindowViewModel : ViewModelBase
    {
        private ViewModelSquares[] worldMap;
        private readonly Constants constants = new Constants();
        private readonly Engine engine;
        private int countRows;
        private int countColumns;
        ConstructorSquareViewModel constructor = new ConstructorSquareViewModel();
 
 
        public ViewModelSquares[] WorldMap
        {
            get { return worldMap; }
            set
            {
                worldMap = value;
                RaisePropertyChanged("WorldMap");
            }
        }
 
        public int CountRows
        {
            get { return countRows; }
            set
            {
                countRows = value;
                RaisePropertyChanged("CountRows");
            }
        }
        public int CountColumns 
        {
            get { return countColumns; }
            set
            {
                countColumns = value;
                RaisePropertyChanged("CountColumns");
            }
        }
 
 
        public MainWindowViewModel()
        {
            CountRows = constants.WorldSizeY;
            CountColumns = constants.WorldSizeX;
 
 
            engine = new Engine();
 
            RefreshMap();
            
            BehaviorSquare.Update += BehaviorSquare_Update;
        }
 
        private void BehaviorSquare_Update(object sender, UpdateInfo e)
        {
            RefreshMap();
            //WorldMap[e.CurrentIndex] = constructor.ConstructorViewModel(engine.WorldMap[e.CurrentIndex]);
            //WorldMap[e.NewIndex] = constructor.ConstructorViewModel(engine.WorldMap[e.NewIndex]);
        }
 
        private void RefreshMap()
        {
            WorldMap = new ViewModelSquares[constants.WorldSizeX * constants.WorldSizeY];
 
            for (int i = 0; i < constants.WorldSizeX * constants.WorldSizeY; i++)
            {
                if (engine.WorldMap[i] != null)
                    WorldMap[i] = constructor.ConstructorViewModel(engine.WorldMap[i]);
            }
        }
    }
Это мне теперь свой массив писать с эвентами?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
30.07.2020, 00:47
Цитата Сообщение от Mobile02 Посмотреть сообщение
Это мне теперь свой массив писать с эвентами?
НЕТ!
Надо просто в VM передать диспетчер, и обновлять ObservableCollection через диспетчер.

Добавлено через 21 секунду
Поищите по форуму - масса тем по этому вопросу.
0
3 / 3 / 0
Регистрация: 27.05.2020
Сообщений: 26
30.07.2020, 17:26  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Надо просто в VM передать диспетчер, и обновлять ObservableCollection через диспетчер.
Я делал вот так:
C#
1
2
3
4
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(() =>
            {
                тут код для обновления коллекции
            }));
коллекция обновлялась, но на View ничего не менялось. Только если все коллекцию заново создать и заполнить, тогда изменения отображались на View, а я от этого то и хотел уйти, чтобы не всю, а только нужную часть обновить, иначе все тормозит.
Я сделал проще, просто у тех элементов что не нужны, меняю координаты на -1. Может это и костыль, но так все работает и не тормозит, осталось только как то скрыть их с экрана (сейчас они все кучкуются в координатах 0, 0). А это опять в XAML лезть в котором я толком не понимаю ничего.
0
WPF Разработчик
 Аватар для sttrox
463 / 167 / 42
Регистрация: 20.02.2018
Сообщений: 285
30.07.2020, 19:36
Mobile02, Вам не надо обновлять коллекцию! У Вас привязаны позиции X и Y, если хотите переместить ячейку -- меняйте ей эти координаты. Если хотите поменять цвет ячейки то ищите её по координатам и меняйте в ней цвет
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
30.07.2020, 20:45
Цитата Сообщение от Mobile02 Посмотреть сообщение
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Поищите по форуму - масса тем по этому вопросу.
Я делал вот так:
Можно и так.
Но не во всех сборках доступен класс Application.
Поэтому предпочтительней передать диспетчер в конструктор VM
C#
1
2
3
4
5
6
7
8
9
10
11
public class ViewModel
{
      public Dispatcher Dispatcher {get;}
      public ViewModel (Dispatcher dispatcher)
         => Dispatcher = dispatcher;
 
      .... SomeMetod(....)
      {
             Dispatcher.Invoke(....); 
      }
}

А в Code Behind App или Window
C#
1
  ViewModel viewModel = new ViewModel(Dispatcher);
Добавлено через 8 минут
Цитата Сообщение от Mobile02 Посмотреть сообщение
коллекция обновлялась, но на View ничего не менялось.
Обновление коллекции это: добавление или вставка элемента в неё, удаление элемента из неё, замена элемента в ней, изменение порядка элементов в ней.
Сама коллекция для автообновления WPF-представления обязательно должна реализовывать INotifyCollectionChanged.
Из дефолтных Net коллекция, самая простая с INCC это ObservableCollection<T>.

Изменение свойств элемента не считается обновлением коллекции.
Для обновления WPF представления после изменения свойств элемента, тип элемента должен реализовывать INotifyPropertyChanged и уведомлять об изменении свойства через этот итнтерфейс.

Добавлено через 2 минуты
Для исключения случайных ошибок, свойство-коллекция типа ObservableCollection лучше реализовывать "ТОЛЬКО ДЛЯ ЧТЕНИЯ":
C#
11
12
    public ObservableCollection<ViewModelSquares> WorldMap {get;}
            =  new ObservableCollection<ViewModelSquares>();
Добавлено через 9 минут
Цитата Сообщение от Mobile02 Посмотреть сообщение
private void RefreshMap()
C#
61
62
63
64
65
66
67
68
69
70
       private void RefreshMap()
        {
            WorldMap.Clear();
 
            for (int i = 0; i < constants.WorldSizeX * constants.WorldSizeY; i++)
            {
                if (engine.WorldMap[i] != null)
                    WorldMap.Add(constructor.ConstructorViewModel(engine.WorldMap[i]));
            }
        }
Если метод RefreshMap надо вызвать из другого потока, то ОБЯЗАТЕЛЬНО через ДИСПЕТЧЕР !

Добавлено через 5 минут
Цитата Сообщение от sttrox Посмотреть сообщение
Mobile02, Вам не надо обновлять коллекцию! У Вас привязаны позиции X и Y, если хотите переместить ячейку -- меняйте ей эти координаты. Если хотите поменять цвет ячейки то ищите её по координатам и меняйте в ней цвет
Это правильно.
Mobile02, но я не могу дать вам примера реализации поскольку не разбирался как из engine вы получаете нужные данные.
При удалении и добавлении элементов в ObservableCollection привязанный к нему UI элемент удаляется и потом создаётся новый.
Это значительно добавляет вычислительную нагрузку.
Изменение же свойств элемента, только изменяет привязанные свойства уже существующего UI элемента.
Это обходится многократно "дешевле".
1
3 / 3 / 0
Регистрация: 27.05.2020
Сообщений: 26
31.07.2020, 08:32  [ТС]
Цитата Сообщение от sttrox Посмотреть сообщение
Mobile02, Вам не надо обновлять коллекцию! У Вас привязаны позиции X и Y, если хотите переместить ячейку -- меняйте ей эти координаты.
С перемещением проблем нет и не было. Проблема была в удалении клеток с поля и добавлении новых. Но я решил это, может и костыльно, но пока никаких идей других у меня нет.
Цитата Сообщение от sttrox Посмотреть сообщение
Если хотите поменять цвет ячейки то ищите её по координатам и меняйте в ней цвет
Цвет же у меня привязан к типу ViewModel, поэтому просто так не поменять. Надо как раз таки обновлять нужную ViewModel в массиве. Найти не проблема, проблема была в обновлении массива ViewModelей. Если я просто находил в массиве старую VM и менял ее на новую, то View не обновлялась. Но все уже исправлено)

Добавлено через 37 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Обновление коллекции это: добавление или вставка элемента в неё, удаление элемента из неё, замена элемента в ней, изменение порядка элементов в ней.
Сама коллекция для автообновления WPF-представления обязательно должна реализовывать INotifyCollectionChanged.
Из дефолтных Net коллекция, самая простая с INCC это ObservableCollection<T>.
Это считается обновлением коллекции?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
using NaturalSelection.Model;
using NaturalSelection.Model.Support;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
 
namespace NaturalSelection.ViewModel
{
    public class MainWindowViewModel : ViewModelBase
    {
        private ObservableCollection<ViewModelSquares> worldMap;
        private readonly Constants constants = new Constants();
        private readonly Engine engine;
        private int countRows;
        private int countColumns;
        ConstructorSquareViewModel constructor = new ConstructorSquareViewModel();
 
 
        public ObservableCollection<ViewModelSquares> WorldMap
        {
            get { return worldMap; }
            set
            {
                worldMap = value;
                RaisePropertyChanged("WorldMap");
            }
        }
 
        public int CountRows
        {
            get { return countRows; }
            set
            {
                countRows = value;
                RaisePropertyChanged("CountRows");
            }
        }
        public int CountColumns 
        {
            get { return countColumns; }
            set
            {
                countColumns = value;
                RaisePropertyChanged("CountColumns");
            }
        }
 
 
        public MainWindowViewModel()
        {
            CountRows = constants.WorldSizeY;
            CountColumns = constants.WorldSizeX;
 
            engine = new Engine();
            WorldMap = new ObservableCollection<ViewModelSquares>();
 
            RefreshMap(index);
        }
        private void RefreshMap(int index)
        {
            WorldMap.Insert(index, constructor.ConstructorViewModel(engine.WorldMap[index]));
        }
    }
}
то что вызов в конструкторе, не обращайте внимания, для примера написал, вызывался он по другому, при определенном событии в engine.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
31.07.2020, 13:55
Цитата Сообщение от Mobile02 Посмотреть сообщение
Это считается обновлением коллекции?
Метод WorldMap.Insert - да.

А свойство WorldMap сделайте ТОЛЬКО ДЛЯ ЧТЕНИЯ.
C#
25
26
       public ObservableCollection<ViewModelSquares> WorldMap {get;}
          = new ObservableCollection<ViewModelSquares>();
Поле worldMap - удалите.

Добавлено через 2 минуты
Цитата Сообщение от Mobile02 Посмотреть сообщение
вызывался он по другому, при определенном событии в engine.
События обычно происходят асинхронно.
Поэтому не забудьте перевести исполнение метода RefreshMap в Диспетчер.
Как задавать Диспетчер в VM я уже постом выше показывал.
0
3 / 3 / 0
Регистрация: 27.05.2020
Сообщений: 26
31.07.2020, 13:58  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Метод WorldMap.Insert - да.
Но у меня ровным счетом ничего не происходило. Ради исключения ошибки с неверно найденным индексом, полностью всю коллекцию инсертом проходил и ничего на View не обновлялось. Короче я отказался уже от этого, сейчас все по другому работает. Нет теперь нужды вообще что то с коллекцией делать. Интересно только почему не срабатывало обновление.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
31.07.2020, 14:56
Цитата Сообщение от Mobile02 Посмотреть сообщение
Интересно только почему не срабатывало обновление.
На Гите есть эта фиксация?
Если есть, то дайте её номер или время.
0
3 / 3 / 0
Регистрация: 27.05.2020
Сообщений: 26
31.07.2020, 15:01  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
На Гите есть эта фиксация?
Нету, эти эксперименты не фиксировал. Могу набросать что нибудь подобное, у меня ObservableCollection всегда так себя вел.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
31.07.2020, 15:03
Цитата Сообщение от Mobile02 Посмотреть сообщение
Могу набросать что нибудь подобное, у меня ObservableCollection всегда так себя вел.
Да, сделайте пример который можно запустить и будет полезен для вас.
Потому, что по коду ошибок не вижу.
Может они вне предоставленного вами кода.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.07.2020, 15:03

Как получить доступ к данным в Grid?
На форме есть Grid, я его заполняю так: mdb = New OleDbConnection mdb.ConnectionString = &quot;Строка соединения с mdb-файлом&quot; ...

Работа с чужим окном. WinApi получить данные из Grid
Есть приложение, написанное на Delphi. В этом приложении есть элемент таблица, а конкретно это TNextGrid. Как я понял это что-то на подобии...

Как получить ссылку на выбранную строку не в Grid, а в связанной таблице?
У меня на форме есть DataGrid с которой связана некоторая таблица DataTable. Когда мне нужно получить текущую строку в этой DataTable, я...

Как получить строку и столбец элемента из grid через код?
Вот сижу репу чешу ничего придумать не могу и прошу помощи=) Добавлено через 1 час 1 минуту Заранее спасибо уже сам нашел=) Тут...

Не могу прикрутить bindingnavigator к grid, которая связана с другой grid
вот код, если бы grid не были связаны то и проблем бы не было. а тут никак не получается. нужно чтобы binding навигатор относился к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru