- первая сетка предназначена для проектов (отображает запланированные часы на проект и в неделю),
- вторая сетка предназначена для людей (отображает доступные часы и запланированные часы на человека и в неделю) и
- третья сетка предназначена для ежедневного планирования рабочего времени для людей в проектах (назовем это планом мощности).
План мощности показывает одну строку для каждого человека и проекта, показывая запланированное рабочее время каждого дня для этого человека в одной DataGridCell.
Моя модель представления плана мощности содержит ObservableCollection недельных моделей представления. Неделя ViewModel содержит наблюдаемую коллекцию дневных ViewModel. ViewModel дня содержит ViewModel часа (одно свойство — это запланированные часы в виде строки отображения), свойство Cell Foreground, свойство Cell Background и другие.
Если кто-то хочет спланировать проект, он перетаскивает проект (из первой сетки) в планировщик мощности, а затем перетаскивает ячейку «доступные часы на этой неделе» для людей (вторая сетка) (в план мощности и помещает ее в соответствующий проект. Затем приложение вычисляет максимально возможное значение). ежедневные плановые часы для этого работника в проекте (в соответствии с ежедневными часами доступности рабочих).
В моей первой версии, до того, как я реализовал периоды переключения, она работала отлично и мгновенно отображала вновь рассчитанные плановые часы. Но поскольку я реализовал переключение периодов, DataGridCells не обновляются при изменении значений, даже если MultiValueConverter «запускается» и возвращает правильное значение. значения.
Вот мой MultiValueConverter:
Код: Выделить всё
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Length < 3) return -1;
string parameterString = parameter as string;
int weekIndex = 0;
int dayIndex = 0;
int type = 0;
if (!string.IsNullOrEmpty(parameterString))
{
string[] parameters = parameterString.Split(new char[] { '|' });
if (parameters.Length == 3
&& int.TryParse(parameters[0], out weekIndex)
&& int.TryParse(parameters[1], out dayIndex)
&& int.TryParse(parameters[2], out type))
{
if (values[0] is ObservableCollection weekList
&& values[1] is ObservableCollection displayWeekIndexList
&& values[2] is int periodLength)
{
if (weekIndex >= 0 && weekIndex < periodLength)
{
int globalWeekIndex = displayWeekIndexList[weekIndex];
object returnWert = string.Empty;
if (globalWeekIndex < 0 || globalWeekIndex >= weekList.Count) return string.Empty;
if (type == 0)
{
returnWert = weekList[globalWeekIndex].days[dayIndex].CapacityHours.PlanDisplayValue;
}
else if (type == 1)
{
returnWert = weekList[globalWeekIndex].MaPlan!.IsHeaderRow;
}
else if (type == 2)
{
returnWert = weekList[globalWeekIndex].days[dayIndex].BackgroundColor;
}
else if (type == 3)
{
returnWert = weekList[globalWeekIndex].days[dayIndex].ForegroundColor;
}
return returnWert;
}
}
}
}
}
Код: Выделить всё
Каждый раз, когда я перемещаюсь на один период вперед, я проверяю, загружен ли уже этот период, иначе он загружается. Итак, допустим, я уже загрузил 3 периода, коллекция недель содержит 45 элементов недели. Если я отображаю первый период, displayWeekIndexList содержит индексы от 0 до 14. Если я отображаю второй период, тогда displayWeekIndexList содержит индексы от 15 до 29. Таким образом, displayWeekIndexList всегда содержит 15 элементов.
Может ли кто-нибудь помочь мне и сказать мне, почему мои GridCells не обновляются напрямую при удалении недели доступности человека в плане - посмотрите на снимок экрана. Если я перейду на один период вперед, а затем снова назад, он покажет правильные значения, как я сделал на скриншоте с уже отображенными значениями для недели 43.

Извините за длинное объяснение, но я думаю, что это необходимо для понимания проблемы.
Подробнее здесь: https://stackoverflow.com/questions/797 ... hange-unde
Мобильная версия