在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>
非常感谢任何帮助。
答案 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