2009-07-29 22 views
0

Silverlight 3では、基本的なデータグリッドが生成されていますが、DataGridには空の行が4つ表示されています。Silverlight:DataGridで空の行が表示されるのはなぜですか?

page.xamlおよびpage.xaml.csのコードスニペットは次のとおりです。

コードビハインドをステップ実行したときに、Webサービスが正しくリストされたリストを返すため、e.Resultsが4のカウントを表示し、DataGridが4つの空の行を表示するため、データがe.Resultsに正しく含まれていると思います。 。 (私はまだ正確に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

は4行が実際に空になっているか、多分、前景と背景が同じセットのようなものがあるであることを確認しています。私は十分な時間を過ごしました。また、それは重要ではありませんが、それらのタグは自動的に閉じるので、終了タグではなく最後に/>を使用できます。 – Godeke

答えて

-1

ここで推測しますが、itemssourceプロパティを設定するのではなく、DataContextプロパティを設定する必要があります。 ItemsSourceは、ListBoxなどのコレクションベースのコントロール用であり、項目を設定するために使用するコレクションを定義するために使用されます。

私の推測では、もしそうなら、あなたは、WCFサービス
からオブジェクト(アカウント)を埋め、

this.grdData.DataContex = e.Resultを設定することです。あなたのGetAccountsCompletedハンドラ

良いポストにここのItemsSourceとhttp://anyedotnet.blogspot.com/2008/11/datacontext-vs-itemssource.html

0

のDataContext の違いをsumarrizing私は正確に同じ問題を抱えていました。前景テキストの色と背景色が同じであることが判明しました。それらを変えるだけで、あなたは良いものになるはずです。いくつかの例がここにあります: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}"> 

...

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;    
    } 

私は参考にこれを使用しました。これは一見価値があると思います。複数の方法でバインドする方法を示し、データバインディングの詳細を学ぶ際に役立ちました。

0

列名は大文字と小文字が区別されます。あなたはそれが

Binding="{Binding acpk}" 

なく

Binding="{Binding Acpk}" 
関連する問題