我将从WCF天气服务收到的数据绑定到silverlight中的datagrid。我得到了7天预测的回报。我遇到的问题是返回是一个集合,在这个集合中是温度和降水概率,这是另一个层次。在温度中有高低,然后降水概率有白天和夜晚。
namespace MyProject
{
public partial class MainPage : UserControl
{
WeatherSoapClient weatherClient = new WeatherSoapClient();
public MainPage()
{
InitializeComponent();
weatherClient.GetCityWeatherByZIPCompleted += new EventHandler<GetCityWeatherByZIPCompletedEventArgs>(weatherClient_GetCityWeatherByZIPCompleted);
}
这是我将datagrid的源设置为Forecast Collection的地方。
void weatherClient_GetCityForecastByZIPCompleted(object sender, GetCityForecastByZIPCompletedEventArgs e)
{
this.dataGrid1.ItemsSource = e.Result.ForecastResult;
}
private void button1_Click(object sender, RoutedEventArgs e)
{
weatherClient.GetCityForecastByZIPAsync(inputZip.Text);
}
}
}
我在datagrid中得到的结果如下所示: http://i.stack.imgur.com/9W67v.jpg
正如您在温度和POP下看到的那样,这不是我想要显示的。作为C#的新手,我很难到达我所处的位置。现在有人建议制作一个自定义转换器以深入钻取。我不确定如何做到这一点。任何帮助将不胜感激。希望我展示你需要看到的一切。
答案 0 :(得分:1)
您需要在数据网格上将AutoGenerateColumns
设置为False
,然后自行定义列类型(有关如何在互联网上执行此操作的大量信息)。
对于前几列,DataGridTextColumn
没问题。
对于最后两个,您要使用DataGridTemplateColumn
。在列的DataTemplate
中,您可以放置两个TextBlock,每个绑定到不同的属性。
例如:
<data:DataGrid AutoGenerateColumns="False">
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="Date"
Binding="{Binding Date}" />
<data:DataGridTextColumn Header="ID"
Binding="{Binding WeatherID}" />
<data:DataGridTemplateColumn Header="Temperature">
<data:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Temperatures.High}" />
<TextBlock Text="{Binding Temperatures.Low}" />
</StackPanel>
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
</data:DataGridTemplateColumn>
</data:DataGrid.Columns>
</data:DataGrid>