使用Silverlight为动态数据创建自定义转换器

时间:2012-04-19 01:19:10

标签: c# silverlight xaml ivalueconverter

我将从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#的新手,我很难到达我所处的位置。现在有人建议制作一个自定义转换器以深入钻取。我不确定如何做到这一点。任何帮助将不胜感激。希望我展示你需要看到的一切。

1 个答案:

答案 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>