Silverlight:为什么DataGrid显示空行?

时间:2009-07-29 19:08:39

标签: c# asp.net silverlight

在Silverlight 3中,我想生成一个基本的,填充的DataGrid,但DataGrid显示4个空行。

page.xaml和page.xaml.cs的代码片段如下所示。

我认为数据正确包含在e.Results中,因为当我逐步执行代码隐藏时,Web服务正在返回正确填充的List,e.Results显示计数为4,DataGrid显示四个空行。 (我还没弄明白怎么看e.Results究竟是什么)

以下是page.xaml.cs中的相关代码:

void Page_Loaded(object sender, RoutedEventArgs e)
{
  Service1Client service = new Service1Client();
  service.GetAccountsCompleted += new
   EventHandler<GetAccountsCompletedEventArgs>(service_GetAccountsCompleted );
  service.GetAccountsAsync();

}

void service_GetAccountsCompleted(object sender, GetAccountsCompletedEventArgs e)
{
  this.grdData.ItemsSource = e.Result;
}

以下是DataGrid的xaml定义:

<UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"  x:Class="BegSilver.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
  <data:DataGrid x:Name="grdData"  Margin="15" AutoGenerateColumns="False">

  <data:DataGrid.Columns>

    <data:DataGridTextColumn Binding="{Binding acpk}" Header="acpk"></data:DataGridTextColumn>
    <data:DataGridTextColumn Binding="{Binding acctnumber}" Header="acctnumber"></data:DataGridTextColumn>
    <data:DataGridTextColumn Binding="{Binding name}" Header="name"></data:DataGridTextColumn>
    <data:DataGridTextColumn Binding="{Binding type}" Header="type"></data:DataGridTextColumn>

  </data:DataGrid.Columns>

</data:DataGrid>
</Grid>
</UserControl>

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:0)

我遇到了完全相同的问题。事实证明,前景文本颜色和单元格的背景颜色是相同的。只要改变那些你应该是好的。这里有一些例子:http://silverlight.net/forums/t/42372.aspx

为数据网格添加前景色样式以查看文本。像这样:

<UserControl.Resources>
    <Style x:Key="gridStyle" TargetType="Controls:DataGrid">
        <Setter Property="Foreground" Value="Black" />
    </Style>
</UserControl.Resources>


<Controls:DataGrid x:Name="grid" AutoGenerateColumns="True" Style="{StaticResource gridStyle}">

...

答案 1 :(得分:0)

您不能直接从e.Result执行绑定。

<data:DataGridTextColumn Binding="{Binding acpk}" Header="acpk">
</data:DataGridTextColumn>

你正在使用e.Result正确的轨道,但你真的应该把结果放到一个集合然后使用它。我知道它是多余的,但似乎集合或集合列表等是如何完成“Silverlight方式”

尝试这样的事情。 创建一个类。这将在循环浏览e.Result时处理您的结果。

public class Recording
{
  public Recording() { 
  }
  public Recording(string artistName, string cdName, DateTime release)
  { Artist = artistName; Name = cdName; ReleaseDate = release; }
  public string Artist { get; set; }
  public string Name { get; set; }
  public DateTime ReleaseDate { get; set; }
  // Override the ToString method.
  public override string ToString() 
  { 
    return Name + " by " + Artist + ", Released: " + ReleaseDate.ToShortDateString();
  }
} 

在您调用服务的后面的代码中创建一个集合。这将收集e.Result内容并将其传递给上述类。

 public ObservableCollection<Recording> MyMusic   = new ObservableCollection<Recording>();

在已完成的args事件处理程序中添加类似的内容。

private void  service_GetAccountsCompleted(object sender, GetAccountsCompletedEventArgs e)
{
  foreach (var item in e.Result)
  {   
      MyMusic.Add(new Recording(item.acctnumber, item.acpk, new DateTime(2011, 4, 18)));
      grdData.DataContext = MyMusic;               
  }

我用这个作为参考,我觉得值得一看。它展示了如何以多种方式绑定,并在了解有关数据绑定的更多信息时帮助了我。 http://www.silverlight.net/learn/quickstarts/bindingtocontrols/

答案 2 :(得分:0)

列名称区分大小写。你确定它是

吗?
   Binding="{Binding acpk}"

而不是

   Binding="{Binding Acpk}"

答案 3 :(得分:-1)

这里有一个猜测,但我想冒险而不是设置itemssource属性,你应该设置DataContext属性。 ItemsSource用于基于集合的控件(如ListBox等),用于定义用于填充项目的集合。

我的猜测是你从WCF服务中填充了一个对象(Account) 如果是这样,请设置


该..grdData.DataContex = e.Result;在GetAccountsCompleted处理程序

Good Post在这里夸大了ItemsSource和DataContext之间的差异 http://anyedotnet.blogspot.com/2008/11/datacontext-vs-itemssource.html