如何使用 QueryProperty 作为 Xamarin 中绑定标签的值?
How to use a QueryProperty as the value for a bound label in Xamarin?
我们有一个简单的 Xamarin 应用程序,它有一个项目列表,您可以从中 select 将一个项目传递给另一个视图(以允许购买)。我们正在使用 Xamarin Forms 和 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 class 装饰有:
[QueryProperty("JsonParm", "jsonparm")]
class PurchaseViewModel : BaseViewModel
视图有这样的标签:
<Label Text="{Binding TheProduct.Description}" />
我的问题是我们如何获取 Description 的值以在首次呈现视图时显示?
我们的 PurchaseViewModel 的构造函数在收到 QueryProperty 之前执行。
我们知道这一点是因为我们在 setter 上为 TheProduct 设置了一个断点,并且在绘制表单时它为 null。
我们在该表单上有一个执行 命令 的按钮,如果我们按下该按钮,则会触发 OnPropertyChanged 事件并且我们的标签会神奇地填充。
我们已经搜索 Dr.Google 并没有找到这种确切的情况,但在我们看来这是一个相当普遍的 Master/Detail 类问题。
总结一下:
- View_1 使用当前 selected 项目的 Json 字符串导航到 View_2。
- View_2 有一个标签,必须显示 Json 对象的描述 属性。
- View_2 似乎无法解析 QueryProperty,直到 呈现它之后。
一如既往,我们将不胜感激。
环境:
对比 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));
}
}
设置TheProduct
属性里面的JsonParm
setter:
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))
}
}
我们有一个简单的 Xamarin 应用程序,它有一个项目列表,您可以从中 select 将一个项目传递给另一个视图(以允许购买)。我们正在使用 Xamarin Forms 和 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 class 装饰有:
[QueryProperty("JsonParm", "jsonparm")]
class PurchaseViewModel : BaseViewModel
视图有这样的标签:
<Label Text="{Binding TheProduct.Description}" />
我的问题是我们如何获取 Description 的值以在首次呈现视图时显示?
我们的 PurchaseViewModel 的构造函数在收到 QueryProperty 之前执行。
我们知道这一点是因为我们在 setter 上为 TheProduct 设置了一个断点,并且在绘制表单时它为 null。
我们在该表单上有一个执行 命令 的按钮,如果我们按下该按钮,则会触发 OnPropertyChanged 事件并且我们的标签会神奇地填充。
我们已经搜索 Dr.Google 并没有找到这种确切的情况,但在我们看来这是一个相当普遍的 Master/Detail 类问题。
总结一下:
- View_1 使用当前 selected 项目的 Json 字符串导航到 View_2。
- View_2 有一个标签,必须显示 Json 对象的描述 属性。
- View_2 似乎无法解析 QueryProperty,直到 呈现它之后。
一如既往,我们将不胜感激。
环境:
对比 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));
}
}
设置TheProduct
属性里面的JsonParm
setter:
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))
}
}