ContentView — контекст привязки имеет значение null

В настоящее время я играю с .Net Maui, но, возможно, это то же поведение, что и Xamarin.

Я создал простой Search-Control, основанный на файле .

ObjectSearchControl.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>

ObjectSearchControl.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установлен правильно. Поэтому я подумал, что реализация привязки правильная. Но в моем CollectionView ни один элемент не отображается.

Итак, я много отлаживал и обнаружил, что параметр устанавливается 2 раза. Когда я инициализирую элемент управления, все свойства имеют значения NULL. -> вроде нормально

Затем появляется элемент управления, и я получаю элементы из БД и устанавливаю их в «DataSource».

          <ContentPage.Behaviors>
        <mctBehaviors:EventToCommandBehavior Command="{Binding SetDataSourcesCommand}" EventName="Appearing" />
    </ContentPage.Behaviors>
          private async Task SetDataSources()
    {
        try
        {
            IsBusy = true;

            NonFilterdDataSource = new ObservableCollection<MyTestModel>(await DataService.GetAll());
        }
        finally
        {
            IsBusy = false;
        }
    }

Это также называется и кажется правильным. После этого устанавливается ( OnBindingContextChangedвызывается в моем ObjectSearchControl.xaml.cs), и все свойства (SearchBarPlaceholderText и DataSource) имеют правильные значения. На данный момент в DataSource 9 элементов!

Если я продолжу отладку, для DataSource будет установлено значение NULL, а также BindingContextустановлено значение NULL! Но я не понимаю, почему? Окно вывода в VS показывает только «Внешний код», и я не могу понять, почему это происходит.

Я нашел несколько похожих вопросов, но ни один из них не смог решить мою проблему.

1 ответ

Проанализировав «Внешний код» в VS, я обнаружил, что источник проблемы должен быть где-то в измерении для контроля. Поэтому я удалил от моего внедрение и после этого проблема исчезла. BindingContext устанавливается только один раз, и все работает как положено!

Другие вопросы по тегам