web-dev-qa-db-ja.com

WPF DataGridをObservableCollectionにバインドする方法

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にバインドできますか?このトピックにヒントを与えます。私の貧しい英語を許しなさい。

7
user3769902

次のように、グリッドのItemsSourceプロパティを使用して、コレクション(おそらくビューモデルに配置されている)を参照することで、そうすることができるはずです。

ItemsSource="{Binding Path=DownloadsCollection}" 

次に、列にバインディングを追加して、コレクション内のMyClassオブジェクトの情報(プロパティ)を表示します。

詳しい方法については、 this リンクを確認してください。

編集:

次のようなことを試して、すべてが正しく機能するかどうかを確認してから、カスタム列に移動できます。

<DataGrid ItemsSource="{Binding DownloadsCollection}" />
8
Nahuel Ianni

WPFでのデータグリッドバインディング この回答を確認してください。基本的に、グリッドがデータコンテキストを認識できるように、ItemSourceバインディングを追加する必要があります。

datagrid columnsのバインディングを追加する必要があるので、何を表示するかがわかります。これがお役に立てば幸いです。

さらに、必要に応じて、setterおよびbinding modeDownloadsCollectionを追加することもできます。更新が必要な場合に役立ちます。

1
makambi
<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;
1
Rakesh

次のように動的データグリッドを塗りつぶすことができます。

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>

お役に立てれば幸いです。

0