Поскольку вы не можете легко связать определения строк / столбцов Grid , я предлагаю вам создать простой пользовательский элемент управления, который наследуется непосредственно от Grid .
* 1006.* Вот мой подход с тремя дополнительными свойствами зависимости:
- int MyColumnCount
- int MyRowCount
- ObservableCollection MyChilds
MyColumnCount /MyRowCount будет привязан к свойствам в модели представления, которую вы обновляете, когда получаете новые значения из базы данных.Также ViewModel предоставит коллекцию FrameworkElements, которая будет элементами в Grid и связана с MyChilds.
Вы можете создавать новые элементы управления в ViewModel и использовать свойство присоединенного элемента Grid, чтобы установитьПозиция.Например:
TextBlock b = new TextBlock() { Text = "Hello World!" };
Grid.SetRow(b, <your position>);
Grid.SetColumn(b, <your position>);
Grid.SetColumnSpan(b, <your column span>);
MyChilds.Add(b);
В PropertyChangedCallbacks новых int свойств вы изменяете определения строк / столбцов в соответствии с новыми значениями.Обратный вызов свойства коллекции регистрирует событие изменения коллекции в новой коллекции ObservableCollection и добавляет новые элементы к дочерним элементам сетки при изменении событий.
Это все, что вам нужно для динамических изменений сетки.
На ваш второй вопрос: это довольно просто.В случае, если вы поймали, вы получите отправителя выбранного элемента в сетке.Отправитель - это, в основном, элемент управления с прямым щелчком.Вы можете снова использовать статические функции Grid, чтобы вычислить позицию:
Grid.GetRow(item);
Grid.GetColumn(item);
Grid.GetColumnSpan(item);
С общим количеством строк / столбцов сетки (My ... Count) вы можете вычислить соседние позиции.
Jan