XAML ContentView -绑定上下文设置为空

mefy6pfw  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(143)

目前我正在玩.Net Maui,但我可能这是与Xamarin相同的行为。
我已经创建了一个简单的搜索控件,它是基于一个ContentView

对象搜索控件.xaml

<ContentView
        x:Class="DeepBlue.Controls.ObjectSearchControl"
        xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
        xmlns:converter="clr-namespace:DeepBlue.Converter"
        xmlns:selector="clr-namespace:DeepBlue.Helpers"
    x:Name="MySearchControl">
    <StackLayout
            Orientation="Vertical"
            VerticalOptions="FillAndExpand">
        <SearchBar
                x:Name="ObjectSearchBar"
                IsSpellCheckEnabled="False"
                Keyboard="Text"
                Placeholder="{Binding SearchBarPlaceholderText}"
                TextChanged="ObjectSearchBar_TextChanged" />

        <CollectionView
                x:Name="ObjectResultView"
                HeightRequest="500"
                ItemsSource="{Binding DataSource}"
                SelectionChanged="ObjectResultView_SelectionChanged">
        </CollectionView>
    </StackLayout>
</ContentView>

对象搜索控件. xaml.cs

public partial class ObjectSearchControl : ContentView
    {
        public static readonly BindableProperty SearchBarPlaceholderTextProperty
        = BindableProperty.Create(nameof(SearchBarPlaceholderText), typeof(string),
            typeof(ObjectSearchControl), string.Empty);

    public static readonly BindableProperty DataSourceProperty
        = BindableProperty.Create(nameof(DataSource), typeof(object),
            typeof(ObjectSearchControl));

    public ObjectSearchControl()
    {
        InitializeComponent();

        Content.BindingContext = this;
    }

    public string SearchBarPlaceholderText
    {
        get => (string)GetValue(SearchBarPlaceholderTextProperty);
        set => SetValue(SearchBarPlaceholderTextProperty, value);
    }

        public object DataSource
        {
            get => (object)GetValue(DataSourceProperty);
            set => SetValue(DataSourceProperty, value);
        }
    }

我在网页中插入的这个ContentView

<StackLayout
                x:Name="SelectFishingSection"
                HeightRequest="600"
                HorizontalOptions="FillAndExpand"
                Orientation="Vertical"
                VerticalOptions="FillAndExpand">

                <controls:ObjectSearchControl
                    DataSource="{Binding NonFilterdDataSource}"
                    HeightRequest="550"
                    HorizontalOptions="FillAndExpand"
                    SearchBarPlaceholderText="Placeholder"
                    VerticalOptions="FillAndExpand" />
            </StackLayout>

运行代码后,控件呈现,并且SearchBar中的Placeholdertext设置正确。所以我认为绑定的实现是正确的。但是在我的CollectionView中没有呈现任何元素。
所以我调试了很多,发现BindingContext被设置了2次。当我初始化控件时,所有属性都得到了NULL值。-〉看起来没问题
然后,控件出现,我从DB中获取元素,并将它们设置为“DataSource”。
第一个
这也被称为并且看起来是正确的。在设置了BindingContext(在我的ObjectSearchControl.xaml.cs中调用了OnBindingContextChanged)并且所有属性(SearchBarPlaceholderText和DataSource)都得到了正确的值之后。此时DataSource中有9个元素!
如果我继续调试,DataSource将被设置为NULL,并且BindingContext也将被设置为NULL!但我不明白为什么?VS中的输出窗口仅显示“外部代码”,我不明白为什么会发生这种情况。
我发现了几个类似的问题,但没有一个能解决我的问题。

dwbf0jvd

dwbf0jvd1#

在分析了VS中的“外部代码”后,我发现问题的根源一定是在控件的度量中的某个地方。因此,我从我的controls:ObjectSearchControl实现中删除了VerticalOptions="FillAndExpand",之后问题就消失了。BindingContext只设置了一次,一切都按预期工作!

相关问题