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