Я не знаю, насколько это поможет, но я столкнулся с проблемой отсутствия свойства зависимости со столбцами сетки данных в моем последнем проекте. Чтобы обойти это, я создал событие в модели представления столбцов сетки, затем, когда сетка собирается в клиенте, используйте замыкание, чтобы подписать столбец сетки на модель представления столбцов. Моя конкретная проблема была вокруг ширины. Он начинается с класса модели представления для столбца сетки, который выглядит примерно так: псевдокод:
public delegate void ColumnResizedEvent(double width);
public class GridColumnViewModel : ViewModelBase
{
public event ColumnResizedEvent ColumnResized;
public void Resize(double newContainerWidth)
{
// some crazy custom sizing calculations -- don't ask...
ResizeColumn(newWidth);
}
public void ResizeColumn(double width)
{
var handler = ColumnResized;
if (handler != null)
handler(width);
}
}
Тогда есть код, который собирает сетку:
public class CustomGrid
{
public CustomGrid(GridViewModel viewModel)
{
// some stuff that parses control metadata out of the view model.
// viewModel.Columns is a collection of GridColumnViewModels from above.
foreach(var column in viewModel.Columns)
{
var gridCol = new DataGridTextColumn( ... );
column.ColumnResized += delegate(double width) { gridCol.Width = new DataGridLength(width); };
}
}
}
Когда размер сетки данных изменяется в приложении, происходит событие resize и вызывает метод resize для модели представления, с которой связана сетка. Это, в свою очередь, вызывает метод изменения размера каждой модели представления столбца сетки. Затем модель представления столбца сетки вызывает событие ColumnResized
, на которое подписан текстовый столбец сетки данных, и его ширина обновляется.
Я понимаю, что это не решает вашу проблему напрямую, но это был способ, которым я мог бы "привязать" модель представления к столбцу таблицы данных, когда на нем нет свойств зависимости. Закрытие - это простая конструкция, которая прекрасно описывает желаемое поведение и вполне понятна для тех, кто идет за мной. Я думаю, не сложно представить, как его можно изменить, чтобы справиться с изменением видимости. Вы даже можете подключить обработчик событий к событию загрузки страницы / пользовательского элемента управления.