行为绑定在 CommunityToolkit.Maui 中不起作用

问题描述 投票:0回答:1

我已更新为使用 .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 xaml maui maui-community-toolkit
1个回答
2
投票

.NET MAUI 社区工具包维护者在这里。

是的,这是

CommunityToolkit.Maui v10
的重大变化。

tl;dr 我们不应该自动分配您的

Behavior
BindingContext
,我们现在已经删除了该逻辑。

我承认这是一个痛苦的突破性改变。我也承认我们之前自动为您分配

BindingContext
搞砸了。多年来,它提出了许多问题,我们花了很多时间来实施解决方法,但它最终引导我们为解决方法创建解决方法,以满足每个用户的独特用例。我们无法修复的两个明显的错误是多次重复使用
Behavior
,以及在 DataTemplates 内部使用我们的
Behavior
(例如在 CollectionView、ListView 等内部)都从根本上被破坏了。

背景

.NET MAUI 工程师做出决定,

Behavior
不会自动继承其父母的
BindingContext

enter image description here

这是对

Xamarin.CommunityToolkit
的重大更改,我将库移植到 .NET MAUI 以创建
CommunityToolkit.Maui

我们没有遵循 .NET MAUI 的领导并要求开发人员为每个

BindingContext
设置自己的
Behavior
,而是决定通过自动为您完成此操作来提供帮助。然而,在我们努力帮助开发人员生活更轻松的过程中,我们却产生了更多问题,给开发人员带来了痛苦的错误。

在花了很多时间尝试推导出解决方案后,我们找到的唯一解决方案是恢复原来的实现并停止为每个

BindingContext
自动分配
Behavior

解决方案

修复很简单 - 我们只需要确保为使用 Binding 的行为分配 BindingContext 即可。我建议执行此操作的最佳方法是将

Behavior.BindingContext
绑定到它所附加的控件的
BindingContext

在 XAML 中

在 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>

在 C# 中使用
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));
© www.soinside.com 2019 - 2024. All rights reserved.