TL; DR:如何编写一种(单向)绑定扩展名,使其与普通绑定一样工作,但是如果将源设置为null
则会延迟?
我正在使用MVU体系结构(使用Elmish.WPF),并试图将无效状态排除在模型之外。这意味着,如果我的应用程序不应该显示某个对话框,则该对话框的状态根本不应该存在于模型中。然后,我使用绑定将代表对话框的XAML UserControl的Visibility
设置为“折叠”,如果其DataContext
为null
。
不幸的是,这不适用于动画。切换对话框Visibility
时,该对话框会自动显示动画。但是由于Visibility
可能为false的唯一方法是将对话框的模型(DataContext
)设为null
,所以这意味着视觉行为是对话框中的每个输入都立即清空。一旦动画开始播放,将导致调整大小并通常看起来很奇怪。
我没有使用WPF的经验,但是AFAIK可能的解决方案是使用自定义绑定扩展名(如果需要,可以将其限制为单向),将更改延迟到null
,直到动画已完成。这意味着当从应用程序模型中删除代表对话框的模型部分并将对话框的DataContext
设置为null时,就XAML控件而言,除了{{1 }}绑定,当然可以使用标准绑定来绑定Visibility
所绑定的同一属性(而不是直接绑定到DataContext
本身)。
不幸的是,自定义标记扩展对我来说似乎很神秘,所以我什至不知道从哪里开始。这可能吗,怎么办?
我也可以接受其他解决根本问题的答案。
(我知道一种解决方法是,在关闭对话框时根本不从模型中删除对话框状态,或者在删除对话框之前添加某种延迟以使动画完成,但是前者不允许我将无效状态排除在模型之外,后者将不必要的与UI相关的动画问题强加给中央逻辑,可以在不同的UI项目中使用。)