我已更新为使用 .NET 9,随后将
CommunityToolkit.Maui
更新为 v10.0,因为它是支持 .NET MAUI 的最新版本,但它似乎破坏了我的应用程序中的行为。
具体来说,我在图像上使用
CommunityToolkit.Maui.Behaviors.IconTintColorBehavior
,将其 TintColor
绑定到我的 ViewModel 中的属性(请参阅下面的代码)。
<Image Source="shield.png">
<Image.Behaviors>
<mct:IconTintColorBehavior TintColor="{Binding ImageTintColor}" />
</Image.Behaviors>
</Image>
在
CommunityToolkit.Maui
的早期版本中,此代码工作正常,但由于某种原因,我的绑定不再触发。
.NET MAUI 社区工具包维护者在这里。
是的,这是
CommunityToolkit.Maui v10
的重大变化。
tl;dr 我们不应该自动分配您的
Behavior
的 BindingContext
,我们现在已经删除了该逻辑。
我承认这是一个痛苦的突破性改变。我也承认我们之前自动为您分配
BindingContext
搞砸了。多年来,它提出了许多问题,我们花了很多时间来实施解决方法,但它最终引导我们为解决方法创建解决方法,以满足每个用户的独特用例。我们无法修复的两个明显的错误是多次重复使用 Behavior
,以及在 DataTemplates 内部使用我们的 Behavior
(例如在 CollectionView、ListView 等内部)都从根本上被破坏了。
Behavior
不会自动继承其父母的 BindingContext
这是对
Xamarin.CommunityToolkit
的重大更改,我将库移植到 .NET MAUI 以创建 CommunityToolkit.Maui
。
我们没有遵循 .NET MAUI 的领导并要求开发人员为每个
BindingContext
设置自己的 Behavior
,而是决定通过自动为您完成此操作来提供帮助。然而,在我们努力帮助开发人员生活更轻松的过程中,我们却产生了更多问题,给开发人员带来了痛苦的错误。
在花了很多时间尝试推导出解决方案后,我们找到的唯一解决方案是恢复原来的实现并停止为每个
BindingContext
自动分配 Behavior
。
修复很简单 - 我们只需要确保为使用 Binding 的行为分配 BindingContext 即可。我建议执行此操作的最佳方法是将
Behavior.BindingContext
绑定到它所附加的控件的 BindingContext
:
在 XAML 中,我们可以使用
x:Name
来命名要附加 Binding 的控件,然后为其 BindingContext
创建一个 Binding:
<Image
x:Name="TintedImage"
Source="shield.png">
<Image.Behaviors>
<mct:IconTintColorBehavior
BindingContext="{Binding Path=BindingContext, Source={x:Reference: TintedImage}}"
TintColor="{Binding ImageTintColor}" />
</Image.Behaviors>
</Image>
CommunityTooklit.Maui.Markup
CommunityTooklit.Maui.Markup
的 C# 中,我们可以使用 .Assign<T>(out T)
创建对要附加绑定的控件的引用,然后为其 BindingContext
创建一个绑定:
new Image()
.Source("shield.png")
.Assign(out Image tintedImage)
.Behaviors(new IconTintColorBehavior()
.Bind(IconTintColorBehavior.BindingContext,
getter: static image => image.BindingContext,
source: tintedImage)
.Bind(IconTintColorBehavior.TintColorProperty
getter: static (MyViewModel vm) => vm.ImageTintColor));