目前我正在玩.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中的输出窗口仅显示“外部代码”,我不明白为什么会发生这种情况。
我发现了几个类似的问题,但没有一个能解决我的问题。
1条答案
按热度按时间dwbf0jvd1#
在分析了VS中的“外部代码”后,我发现问题的根源一定是在控件的度量中的某个地方。因此,我从我的
controls:ObjectSearchControl
实现中删除了VerticalOptions="FillAndExpand"
,之后问题就消失了。BindingContext只设置了一次,一切都按预期工作!