WPF DataGridをObservableCollectionにバインドする方法のヒントを教えてください。いくつかの投稿を見て、直接の回答が見つかりませんでした。そこや至る所に複雑な問題が説明されていますが、私の問題は洗練されていません。監視可能なコレクションとWPF DataGridがあります。どちらも、二重コントラクトWCFサービスのクライアントであるWPFアプリケーションにあります。 ObservableCollectionは次のとおりです。
private ObservableCollection<MyClass> _myCollection = new ObservableCollection<MyClass>();
public ObservableCollection<MyClass> DownloadsCollection
{
get { return this._downloadsCollection; }
}
以下は、DataGridを使用したXAMLマークアップです。
<Window x:Class="DownloadManager_Client.MainWindow"
. . . . . . . .>
<DataGrid Name="dgDownloadsInfo" Grid.Row="2" Grid.Column="0" AutoGenerateColumns="False" CanUserAddRows="False"
CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserResizeColumns="False"
CanUserResizeRows="False" CanUserSortColumns="False" SelectionMode="Single" SelectionChanged="dgDownloadsInfo_SelectionChanged">
<DataGrid.Columns>
<DataGridTextColumn Header="DownloadId" Visibility="Hidden"/>
<DataGridTextColumn Header="Target URL" FontFamily="Arial" />
<DataGridTextColumn Header="Content Size" FontFamily="Arial"/>
<DataGridTextColumn Header="Path to Save" FontFamily="Arial"/>
<DataGridTextColumn Header="Bytes Downloaded" FontFamily="Arial"/>
<DataGridTextColumn Header="Percent (%)" FontFamily="Arial"/>
<DataGridTextColumn Header="Status" FontFamily="Arial"/>
</DataGrid.Columns>
</DataGrid>
. . . . . . . .
</Window>
そして、これがmyClassクラスです。 WCFサービスに実装されています。クライアントは、デュプレックスコントラクトを持つWCFサービスからのコールバックでMyClassのインスタンスを受信します。 MyClassの各インスタンスが受信された後、それはObservableCollectionに入れられ、同じ一意の識別子を持つ以前のインスタンスに置き換えられます。
[DataContract]
public class MyClass
{
#region Properties
/// <summary>
/// Downloading unique ID.
/// </summary>
[DataMember]
public Guid UniqueId { get; set; }
/// <summary>
/// Target URL.
/// </summary>
[DataMember]
public String TargetUrl { get; set; }
/// <summary>
/// Path to Save.
/// </summary>
[DataMember]
public String PathToSave { get; set; }
/// <summary>
/// Percentage.
/// </summary>
[DataMember]
public Int32 Percentage { get; set; }
/// <summary>
/// Downloaded bytes number.
/// </summary>
[DataMember]
public Int64 DownloadedBytesQuantity { get; set; }
/// <summary>
/// Content size.
/// </summary>
[DataMember]
public Int64 RealContentLength { get; set; }
/// <summary>
/// Downloading status.
/// </summary>
[DataMember]
public String Status { get; set; }
#endregion
}
私の例ではどのようにDataGridをObservableCollectionにバインドできますか?このトピックにヒントを与えます。私の貧しい英語を許しなさい。
次のように、グリッドのItemsSource
プロパティを使用して、コレクション(おそらくビューモデルに配置されている)を参照することで、そうすることができるはずです。
ItemsSource="{Binding Path=DownloadsCollection}"
次に、列にバインディングを追加して、コレクション内のMyClass
オブジェクトの情報(プロパティ)を表示します。
詳しい方法については、 this リンクを確認してください。
編集:
次のようなことを試して、すべてが正しく機能するかどうかを確認してから、カスタム列に移動できます。
<DataGrid ItemsSource="{Binding DownloadsCollection}" />
WPFでのデータグリッドバインディング この回答を確認してください。基本的に、グリッドがデータコンテキストを認識できるように、ItemSource
バインディングを追加する必要があります。
datagrid columns
のバインディングを追加する必要があるので、何を表示するかがわかります。これがお役に立てば幸いです。
さらに、必要に応じて、setter
およびbinding mode
にDownloadsCollection
を追加することもできます。更新が必要な場合に役立ちます。
<DataGrid x:Name="employeeGrid" HorizontalAlignment="Center" VerticalAlignment="Center" AlternatingRowBackground="LightBlue" AlternationCount="2" AutoGenerateColumns="False" ItemsSource="{Binding}">
<DataGrid.Columns>
<DataGridTextColumn Header="Emp #" Binding="{Binding EmpId}"/>
<DataGridTextColumn Header="First Name" Binding="{Binding FirstName}"/>
<DataGridTextColumn Header="Last Name" Binding="{Binding LastName}"/>
</DataGrid.Columns>
</DataGrid>
以下は、対応する.csファイルに入ります。
employeeGrid.ItemsSource = employeeDetails;
次のように動的データグリッドを塗りつぶすことができます。
ObservableCollection<CaseItem> data = new ObservableCollection<CaseItem>();
this.CasesDataGrid.ItemsSource = data;
ただし、クラスの各項目に列をバインドすることを忘れないでください。
XAMLコードは次のようになります。
<DataGrid x:Name="CasesDataGrid" Grid.Row="1" Grid.Column="0" AutoGenerateColumns="False" SelectionUnit="FullRow" SelectionMode="Extended" CanUserAddRows="False" GridLinesVisibility="Horizontal">
<DataGrid.Columns>
<DataGridTextColumn Width="*" Header="ID" Binding="{Binding CaseID}"/>
<DataGridTextColumn Width="*" Header="Date" Binding="{Binding CaseDate}"/>
<DataGridTextColumn Width="*" Header="Plate" Binding="{Binding CasePlate}"/>
<DataGridTextColumn Width="*" Header="Candidate" Binding="{Binding CaseCandidate}"/>
<DataGridTextColumn Width="*" Header="Base" Binding="{Binding CaseBase}"/>
<DataGridTextColumn Width="*" Header="Speed" Binding="{Binding CaseSpeed}"/>
<DataGridTextColumn Width="*" Header="Photo" Binding="{Binding CasePhoto}"/>
</DataGrid.Columns>
</DataGrid>
お役に立てれば幸いです。