有没有办法将 BindingContext 属性转换回包含数据的原始对象?
我拥有的是自定义控件,
ThingDisplay, with x:Name="thingDisplay" and x:DataType="Thing"
。它仅显示事物模型中的数据。
型号
Thing.cs
:
public class Thing
{
public string Name { get; init; }
public string Description { get; init; }
}
主页:
<ResourceDictionary>
<DataTemplate x:Key="Template">
<controls:ThingDisplay>
<controls:ThingDisplay.Behaviors>
<toolkit:TouchBehavior BindingContext="{vm:MainViewModel}"
LongPressCommand="{Binding ShowPopupCommand}"
LongPressCommandParameter="{Binding Path=TODO, Source={x:Reference thingDisplay}}"
LongPressDuration="750" />
</controls:ThingDisplay.Behaviors>
</controls:ThingDisplay>
</DataTemplate>
</ResourceDictionary>
.
.
.
<CollectionView
ItemsSource="{Binding CollectionItems}"
ItemTemplate="{StaticResource Template}">
</CollectionView>
MainViewModel 仅包含以下内容:
public partial class MainViewModel : ObservableObject
{
public MainViewModel()
{
CollectionItems = [.....];
}
public ObservableCollection<Thing> CollectionItems{ get; private set; }
[RelayCommand]
async void ShowPopup(Thing th)
{
var popup = new Popup(th);
var res = await Application.Current.MainPage.ShowPopupAsync(popup);
if (res == 1)
CollectionItems.Remove(th);
}
现在,我需要什么:
public Thing TODO=> //BindingContext conversion back to Thing
public ThingDisplay()
{
InitializeComponent();
}
我需要将原始 Thing 对象作为 TouchBehaviour 上的视图模型命令参数传递。
当我尝试明显的转换路线 (Thing)BindingContext 时,它抛出了 null ref 错误。
我知道 BindingContext 以某种方式存储原始数据,因为在实时 XAML 预览期间检查它甚至显示它知道类型
Thing
。
我是否遗漏了什么,或者有什么替代路线?
PS:我知道这是一种极其奇怪且复杂的获取数据的方式,但在绑定到外部控件时,我一直在工具包 touchbehaviour 上遇到奇怪的绑定缓存问题(更多信息) https://stackoverflow.com/questions/78540725/stop-datatemplate-from-recycling-bindings-in-net-maui)
您可以先创建一个具有名称和描述属性的对象。然后通过 QueryProperty 发送该对象。
public class Thing
{
public string Name { get; init; }
public string Description { get; init; }
}
然后就可以创建一个包来打包数据了。这是您可以参考的演示:
async void GoTapGestureRecognizer_Tapped(object sender, EventArgs e)
{
Label label1 = (Label)sender;
Package package= new Package() { Name = label1.Text, Description = "your name" };
var navigationParameter = new Dictionary<string, object> { { "MyPackage", package } };
await Shell.Current.GoToAsync($"MyPage", navigationParameter);
}
最后,您需要在导航到的页面顶部创建 QueryProperty
[QueryProperty(nameof(MyPackage), "MyPackage")]
。
public Package MyPackage
{
set
{
ShowMessage(value);
}
}
public async void ShowMessage(Package package)
{
var description = package.Description;
var name = package.Name;
await DisplayAlert("Query", description + name, "Ok");
}