Привязка в DataTemplate не работает при первой загрузке представления - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть свойство зависимости для пользовательского элемента управления, которое я пытаюсь привязать к свойству в модели представления. Элемент управления находится внутри DataTemplate на виде (a UserControl). Однако кажется, что привязка работает только в том случае, если характеристики привязки изменяются после загрузки представления.

Итак, вот пример того, что находится в XAML представления:

<dxb:BarStaticItem Alignment="Far">
    <dxb:BarStaticItem.ContentTemplate>
        <DataTemplate>
            <controls:AllMaxDateRangeCombo Grid.Row="1"
                                           DateRange="{Binding DataContext.WorkOrderDateRange, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=UserControl}}"
                                           TimeFrameType="Current"
                                           Width="150" />
        </DataTemplate>
    </dxb:BarStaticItem.ContentTemplate>
</dxb:BarStaticItem>

BarStaticItem - это элемент управления Dev Express, используемый при помещении «обычных» элементов управления на панель инструментов. Привязка, которую я определил в AllMaxDateRangeCombo, не работает при первой загрузке представления. Но во время выполнения (во время отладки), если изменить имя свойства, добавив в него значение di git, а затем немедленно удалив это di git, привязка начнет работать.

Из-за отсутствия лучшего понимания я могу только сказать, что кажется, что привязка не «правильно подключается» при первой загрузке, или что она пытается выполнить до того, как какая-то ее часть будет готова. Но потом, когда я делаю изменения во время выполнения, они внезапно связываются.

Надеюсь, этого достаточно, чтобы кто-то помог мне разобраться, что здесь происходит.

PS: использование Sn Инструмент oop, я вижу, что свойство зависимости элемента управления DateRange вообще не имеет привязки, пока я не внесу это изменение во время выполнения. Затем появляется привязка. Так что по какой-то причине определенная мной привязка просто не срабатывает при первой загрузке представления.

РЕДАКТИРОВАТЬ: в ответ на вопрос я объясню немного механики. AllMaxDateRangeCombo - это в основном ComboBox с вариантами выбора: LastMonth, Today, LastWeek и др. c. Когда выбор сделан, диапазон дат пересчитывается и присваивается свойству зависимости DateRange элемента управления. Поскольку это свойство, которое я пытаюсь связать, я ожидаю, что свойство модели представления пользовательского интерфейса изменится вместе с ним. Затем я отвечал и обновлял данные интерфейса. Но это значение свойства никогда не меняется. Следовательно, либо привязка никогда не подключается, либо она не может уведомлять об изменениях.

1 Ответ

0 голосов
/ 09 апреля 2020

Это закончилось тем, что значения в элементе управления были изменены. В элементе управления было определено это свойство зависимости:

public static DependencyProperty DateRangeProperty = DependencyProperty.Register("DateRange", typeof(DateTimeRange), typeof(AllMaxDateRangeCombo), new PropertyMetadata(new DateTimeRange(DateTime.MinValue, DateTime.MaxValue)));
public DateTimeRange DateRange
{
    get => (DateTimeRange)GetValue(DateRangeProperty);
    set => SetValue(DateRangeProperty, value);
}

После того, как выбор поля со списком изменился, было установлено это значение:

private void RecalculateDates()
{
    DateRange = new DateTimeRange(DateTime.MinValue, DateTime.MaxValue);
}

Это хорошо работало при двусторонней привязке до тех пор, пока использование элемента управления не было в DataTemplate. Но если он был использован в DataTemplate, то работает только эта версия:

SetCurrentValue(DateRangeProperty, new DateTimeRange(DateTime.MinValue, DateTime.MaxValue));
...