.net MAUI 将 BindingContext 转换回包含对象的原始数据

问题描述 投票:0回答:1

有没有办法将 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

c# .net xaml mvvm maui
1个回答
0
投票

您可以先创建一个具有名称和描述属性的对象。然后通过 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");  
   } 
© www.soinside.com 2019 - 2024. All rights reserved.