使用 MVVMCross 的属性条件绑定

Conditional Binding of Properties using MVVMCross

使用 mvvmcross 绑定实现以下内容的最佳方法是什么:

if (ViewModel.NumberOfUsers > 1)
  set.Bind (NumberOfUsersLabel).To ("NumberOfUsers + ' Users'");
else
  set.Bind (NumberOfUsersLabel).To ("NumberOfUsers + ' User'");

非常感谢您的帮助!

我只想创建一个 属性,它在您的视图模型中有一个 getter。

public string NumberOfUsersFormatted { get { return NumberOfUsers + " user"; } }

然后在你的 ViewDidLoad 中:

set.bind(NumberOfUsersLabel).To(NumberOfUsersFormatted);

然后您可以将任何额外的检查放入您的视图模型中 属性。

如果您不喜欢这样,您也可以设置自己的 ValueConverter 来附加正确的词。

通常,Mvvm 开发人员在 ValueConverter

中进行这种类型的格式化

有关这方面的更多信息,请参阅 https://github.com/MvvmCross/MvvmCross/wiki/Value-Converters

这包括 "time ago" 示例,它显示了如何根据当前值更改字符串:

public class MyTimeAgoValueConverter : MvxValueConverter<DateTime, string>
{
    protected override string Convert(DateTime value, Type targetType, object parameter, CultureInfo cultureInfo)
    {
        var timeAgo = DateTime.UtcNow - value;
        if (timeAgo.TotalSeconds < 30)
        {
            return "just now";
        }

        if (timeAgo.TotalMinutes < 10)
        {
            return "a few minutes ago";
        }

        if (timeAgo.TotalMinutes < 60)
        {
            return "in the last hour";
        }

        if (timeAgo.TotalMinutes < 24*60)
        {
            return "in the last day";
        }

        return "previously";            
    }
}