为何转换器接收的是Microsoft.Maui.Controls.Binding而非实际值?
兄弟,我一眼就瞅出你代码里的问题啦——你的MultiBinding绑定写法搞错了,这才导致转换器拿到的不是实际属性值,而是Binding对象本身!
咱来拆解下问题所在:
第一个Binding的写法完全错了:你写的
<Binding Source="{Binding Route}" />,这里的Source是用来指定绑定的数据源的,结果你给它赋值了{Binding Route},这相当于把数据源直接设成了一个Binding实例,而不是Route属性的实际值。正确的做法是直接绑定当前ShellSection的Route属性,写成<Binding Path="Route" />就行(如果是当前上下文的属性,甚至可以简化成<Binding Route />)。第二个Binding缺了关键的属性路径:你写的
<Binding Source="{x:Reference thisShell}" />只指定了数据源是根Shell实例,但没说要拿它的哪个属性!所以它直接把thisShell这个对象传给了转换器,而不是你需要用来对比的那个属性(比如当前Shell的路由属性)。你得加上Path,比如<Binding Source="{x:Reference thisShell}" Path="CurrentRoute" />,这样转换器才能拿到对应的字符串值。
给你改好的代码示例:
<Label> <Label.Text> <MultiBinding Converter="{converters:StringCompareConverter}"> <!-- 绑定当前ShellSection的Route属性 --> <Binding Path="Route" /> <!-- 绑定根Shell的CurrentRoute属性,用来做对比 --> <Binding Source="{x:Reference thisShell}" Path="CurrentRoute" /> </MultiBinding> </Label.Text> </Label>
这么改完之后,你的转换器Convert方法里的values数组,就会拿到两个实际的字符串值了——第一个是当前ShellSection的Route,第二个是根Shell的当前路由,你直接在转换器里对比这俩值返回true或false就搞定啦!
备注:内容来源于stack exchange,提问作者Toto

