【问题标题】:How to use a QueryProperty as the value for a bound label in Xamarin?如何使用 QueryProperty 作为 Xamarin 中绑定标签的值?
【发布时间】:2021-07-09 23:17:03
【问题描述】:

我们有一个简单的 Xamarin 应用程序,它有一个项目列表,您可以从中选择一个以传递到另一个视图(以允许购买)。我们正在使用 Xamarin Forms 和 MVVM 模式。
我们的 List 表单有一个调用

的命令
private async Task Purchase(object parm)
{
   Product theProduct = parm as Product;
   string json = System.Text.Json.JsonSerializer.Serialize(theProduct);
   await _navigationService.NavigateTo("///purchase", json);        
 }

传递我们希望购买的商品的 Json 表示。 这会用这段代码调用我们的助手。

public Task NavigateTo(string route, string data)
{
   return Shell.Current.GoToAsync($"{route}?jsonparm={data}");
} 

问题是我们将 json-ized 对象的一个​​属性绑定到 purchase 表单上的一个标签上,但是表单是在收到查询之前呈现的。
我们的 ViewModel 具有以下属性:

string _jsonParm;
public string JsonParm
{
   get { return _jsonParm; }
   set { _jsonParm = Uri.UnescapeDataString(value); }
}

Product _theProduct;
public Product TheProduct
{
  get
    {
      if (_theProduct == null)
      {
         if (!string.IsNullOrWhiteSpace(JsonParm))
         {
           _theProduct = System.Text.Json.JsonSerializer.Deserialize<Product>(JsonParm);
           OnPropertyChanged(nameof(TheProduct));
         }
      }
      return _theProduct;
   }
}

PurchaseViewModel 类是这样装饰的:

[QueryProperty("JsonParm", "jsonparm")]
class PurchaseViewModel : BaseViewModel

视图有这样的标签:

<Label Text="{Binding TheProduct.Description}" />

我的问题是我们如何在第一次渲染视图时获取 Description 的值来显示?

PurchaseViewModel 的构造函数在收到 QueryProperty 之前执行。
我们知道这一点是因为我们在 TheProductsetter 上设置了一个断点,并且在绘制表单时它为空。

我们在该表单上有一个执行命令的按钮,如果我们按下该按钮,就会触发 OnPropertyChanged 事件并神奇地填充我们的标签。

我们搜索了 Dr.Google 并没有找到这种确切的情况,但在我们看来,这似乎是一个相当常见的 Master/Detail 类型的问题。

总结一下:

  • View_1 使用当前所选项目的 Json 字符串导航到 View_2。
  • View_2 有一个必须显示 Json 对象的 Description 属性的标签。
  • View_2 似乎无法解析 QueryProperty,直到 呈现它。

像往常一样,感谢任何帮助。

环境:
VS 2019
.Net 标准 2.1
Xamarin 16.9

** 对建议和接受的答案进行轻微修改**

 string _jsonParm;
        public string JsonParm
        {
            get { return _jsonParm; }
            set
            {
                _jsonParm = Uri.UnescapeDataString(value);
                TheProduct = System.Text.Json.JsonSerializer.Deserialize<Product>(_jsonParm);            
            }
        }

        Product _theProduct;
        public Product TheProduct
        {
            get { return _theProduct; }
            set
            {
                _theProduct = value;
                OnPropertyChanged(nameof(TheProduct));
            }
        }

【问题讨论】:

    标签: c# xamarin.forms mvvm query-parameters xamarin.forms.shell


    【解决方案1】:

    JsonParm setter 中设置TheProduct 属性:

    string _jsonParm;
    public string JsonParm
    {
       get { return _jsonParm; }
       set
       {
           _jsonParm = Uri.UnescapeDataString(value);
           TheProduct = System.Text.Json.JsonSerializer.Deserialize<Product>(_jsonParm);            
       }
    }
    
    Product _theProduct;
    public Product TheProduct
    {
      get { retunr_theProduct; }
      set
      {
          _theProduct= value;
          OnPropertyChanged(nameof(TheProduct))
       }
    }
    

    【讨论】:

    • 这行得通,请参阅我的编辑以获得一点说明
    • 很糟糕,我知道我在匆忙中错过了一些东西,感谢您指出:)
    猜你喜欢
    • 2022-10-02
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 2016-09-25
    • 1970-01-01
    • 2019-03-09
    相关资源
    最近更新 更多