TL; DR: Как можно написать (одностороннее) расширение привязки, которое работает так же, как обычное связывание, но задерживает, если для источника установлено значение null
?
Я используюархитектура MVU (с использованием Elmish.WPF ) и попытка сохранить недопустимые состояния вне модели.Это означает, что если мое приложение не должно отображать определенный диалог, его состояние вообще не должно существовать в модели.Затем я использую привязки, чтобы установить Visibility
XAML UserControl, представляющего диалог, в Collapsed, если его DataContext
равно null
.
К сожалению, это не очень хорошо работает с анимацией.При переключении Visibility
диалоговое окно автоматически анимируется.Но поскольку единственный способ, которым Visibility
может быть ложным, состоит в том, что модель диалога (DataContext
) имеет значение null
, это означает, что визуальное поведение состоит в том, что каждый ввод в диалоге сразу же очищается после запуска анимации, вызываяизменение размера и в целом выглядит странно.
У меня нет опыта работы с WPF, но AFAIK возможным решением этой проблемы было бы использование настраиваемого расширения привязки (которое может быть ограничено односторонним расширением при необходимости), которое задерживаетизменение на null
до завершения анимации.Это означает, что когда часть модели, представляющая диалоговое окно, удаляется из модели приложения, а для DataContext
диалогового окна устанавливается значение NULL, в отношении элементов управления XAML сразу ничего не изменится, кроме привязки Visibility
, котораябудет, конечно, использовать стандартную привязку к тому же свойству, с которым связан DataContext
(не непосредственно к DataContext
).
К сожалению, пользовательские расширения разметки кажутся мне довольно загадочными, поэтому я недаже не знаю с чего начать.Возможно ли это и как это сделать?
Я также могу принять другие ответы, которые решают основную проблему.
(Я знаю, что обходной путь - просто не удалять состояние диалога измодель, когда диалоговое окно закрыто, или добавьте некоторую задержку перед его удалением, чтобы позволить анимации завершиться, но первая не позволяет мне исключить недопустимые состояния из модели, а вторая налагает ненужные связанные с пользовательским интерфейсомАнимации касаются центральной логики, которая может использоваться в разных проектах пользовательского интерфейса.)