【发布时间】:2018-09-17 14:45:52
【问题描述】:
我在 UWP 中创建了一个自定义控件,但是我遇到的问题是微软也提供了自定义控件,所以我将使用 UWP 社区工具包 OrbitView 作为示例。以下 3 个绑定有效:
<Grid>
<TextBlock Text="{Binding MyProperty}"/>
<TextBlock Text="{x:Bind PageViewModel.MyProperty, Mode=OneWay}"/>
<Toolkit:OrbitView MinItemSize="{x:Bind PageViewModel.MyProperty, Mode=OneWay}" />
</Grid>
标准控件 (TextBlock) 可与 Binding 或 x:Bind 一起使用。但是如果我想在自定义控件上使用 Binding:
<Toolkit:OrbitView MinItemSize="{Binding MyProperty}" />
它没有。在此处和网络上搜索我正在努力弄清楚发生了什么以及为什么。一般的解决方案似乎是只使用 x:Bind。但是,我想将自定义控件放在 UserControl 中,因为我希望在运行时使用 XamlReader 从外部 Xaml 文件加载它的选项。我的理解是你不能在这种情况下使用 x:Bind ,因为它需要在编译时存在。有什么解决方案可以完成我在 UWP 中的目标吗?
【问题讨论】:
-
这很奇怪,因为自定义控件应该具有相同的 DataContext。只是为了测试,您可以将自定义控件上的 DataContext 指向提供的 ViewModel 并尝试一下,即
<Toolkit:OrbitView DataContext={Binding} />或类似的东西。您认为它应该起作用是对的,所以我不确定这里发生了什么。我会说,如果 x:Bind 工作正常,你最好使用它,因为它更快。 -
使用绑定时,DependencyControl 属性上的设置器不会触发。 Binding 采用 DependencyObject 查找 SetValue 方法并直接绑定到它。 DependendencyObjects 是他们自己的面包。
-
至于文本块,我理解 DataContext 是一样的,但我不明白为什么 Toolkit:OrbitView 看不到它。您如何确定它不具有约束力? OrbitView 上的什么不工作?我只是问,因为如果您正在查看用于绑定的 setter,正如我所提到的,您不会在那里看到它。
-
另一种不应该采用这种方式的解决方法是仅 xBind 到 DataContext。
<Toolkit:OrbitView DataContext="{x:Bind PageViewModel}" />这样你的内部 UserControl '应该' 仍然像往常一样绑定到 DataContext 。我承认,即使这样可以解决问题,我也想知道并理解为什么它一开始就不起作用。我几乎可以肯定,它应该按照您使用<Toolkit:OrbitView MinItemSize="{Binding MyProperty}" />的方式工作,从技术上讲,您做得对,所以我很困惑。也请发布 OrbitView XAML。 -
依赖属性包装器使用 x:Bind 触发。您是说他们不会使用 Binding 触发,这可以解释很多,因为我一直在使用它来查看它是否有效。我的 dp 包装器设置器在自定义控件中运行其他代码,所以这就是为什么它们从来没有工作过,对于 OrbitView,我只是在设置器上放了一个断点,然后用 x:Bind 观察它,但不是用 Binding。所以我想这里的谜团已经解决了,谢谢。我确实想出了如何在 UserControl 中使用 x:Bind,所以我想我会这样做。
标签: c# xaml data-binding uwp