Xamarin表单ListView数据绑定两个对象

时间:2017-01-09 08:54:55

标签: c# listview xamarin data-binding

我正在创建具有预测功能的天气应用。我创建了ListView TextCell作为条目。 我想将单元格内的测试格式化为 XXX YY ,其中:

  • XXX是价值
  • YY是单位

我在ContentPage中声明了可观察的集合,它是我的ItemSource,我有另一个重要的属性,weatherUnit

private ObservableCollection<ForecastData> forecast = new ObservableCollection<ForecastData>();
private Unit weatherUnit { get; set; }

我正在构造函数中创建数据模板并设置所有内容:

public WeatherFormsAppPage()
{
    InitializeComponent();
    var forecastWeatherDataTemplate = new DataTemplate(typeof(TextCell));
    forecastWeatherDataTemplate.SetBinding(TextCell.TextProperty, "mainData.Temperature");
    forecastWeatherDataTemplate.SetBinding(TextCell.DetailProperty, "date");
    ForecastView.ItemsSource = forecast;
    ForecastView.ItemTemplate = forecastWeatherDataTemplate;
}

如何将TextCell.TextProperty绑定格式添加为温度和weatherUnit。温度是两倍,天气单位有扩展返回String。现在,只有温度值正确显示,日期显示为详细信息:

Current state

2 个答案:

答案 0 :(得分:1)

您可以创建一个只读属性,为您聚合值,然后绑定到该

public string WeatherData 
{
    get
    {
        return $"{Temperature} {Unit}";
    }
}

结合

forecastWeatherDataTemplate.SetBinding(TextCell.TextProperty, "mainData.WeatherData ");

答案 1 :(得分:0)

我也喜欢大卫的方法。在JSON类中拥有get-only属性无需担心。由于您不想这样做,您还可以编写转换器类并将其添加到绑定中。

public class StringToFormattedTempConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!(value is string))
            return value;

        return $"{(string)value} \u00B0CC";        
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

然后将其添加到绑定中。

forecastWeatherDataTemplate.SetBinding(TextCell.TextProperty, new Binding("mainData.Temperature", BindingMode.Default, new StringToFormattedTempConverter(), null));