如何使用QueryProperty作为Xamarin中绑定标签的值



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

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事件,并且我们的标签会神奇地被填充。

我们搜索了谷歌博士,没有找到这个确切的场景,但在我们看来,这是一个相当常见的Master/Detail类型的问题。

综上所述:

  • View_1使用当前选定项目的Json字符串导航到View_2
  • View_2的Label必须显示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));
}
}

JsonParmsetter:内部设置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))
}
}

相关内容

  • 没有找到相关文章

最新更新