在以下来自 .Net Maui XAML 2009 的示例中,为什么relativeSource无法获取Picker?

问题描述 投票:0回答:3
<Picker>
    <Picker.ItemsSource>
        <c:List x:TypeArguments="x:String">
            <x:String>apple</x:String>
            <x:String>orange</x:String>
        </c:List>
    </Picker.ItemsSource>
    <Picker.SelectedItem>
        <Binding>
            <Binding.Converter>
                <local:SampleConverter SampleBindable="{Binding ItemsSource, Source={RelativeSource FindAncestor, AncestorType={x:Type Picker}}}" />
            </Binding.Converter>
        </Binding>
    </Picker.SelectedItem>
</Picker>

我的理解是,我可以通过在FindAncestor的AncestorType中指定“Picker”来获取Picker控件,但事实似乎并非如此。 谁能解释一下为什么吗?

如果我给Picker起个名字,并将RelativeSource改为x:Reference,如下所示,我就可以成功获取它(“SampleBindable”属性反映了Picker的ItemsSource的内容)。

<Picker x:Name="pick">
<local:SampleConverter SampleBindable="{Binding ItemsSource, Source={x:Reference pick}}" />

但是,每次只为这些绑定命名控件似乎有些多余...... 有谁知道有一种方法可以避免命名 Picker 控件吗?

c# xaml maui findancestor xaml-2009
3个回答
0
投票

Source
通常用于静态寻址位于其他地方的源。如果你想爬树寻找亲戚,你可以使用
RelativeSource
来代替。试试这个:

<local:SampleConverter SampleBindable="{Binding ItemsSource, 
    RelativeSource={RelativeSource AncestorType={x:Type Picker}}}" />

0
投票

根据您的代码,您没有绑定到祖先。官方文件说:

FindAncestor 和 FindAncestorBindingContext 相对绑定模式用于绑定到可视树中某种类型的父元素

选择器不是父元素。我在 xaml 中似乎只有一个选择器。它似乎与自我绑定。所以你可以尝试:

<local:SampleConverter SampleBindable="{Binding Source={RelativeSource Self}, Path=ItemsSource />

0
投票

我知道我迟到了,你可能已经解决了这个问题,但我也遇到了同样的问题,在网上找不到任何东西,而且 MAUI 文档非常缺乏。

您处于正确的路径上,只需删除 FindAncestor,指定路径是可选的,但我总是这样做以提高可读性:

{Binding Path=ItemsSource, Source={RelativeSource AncestorType={x:Type Picker}}}
© www.soinside.com 2019 - 2024. All rights reserved.