繁体   English   中英

如何将WPF DataGrid绑定到ObservableCollection

[英]How to bind WPF DataGrid to ObservableCollection

你能给我一个如何将WPF DataGrid绑定到ObservableCollection的技巧吗? 我看过一些帖子并没有找到直接答案。 这里和任何地方都有错综复杂的问题,但我的问题并不复杂。 我有一个可观察的集合和WPF DataGrid。 它们都在WPF应用程序中,它是双工合同WCF服务的客户端。 这是一个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对象的信息(属性)。

有关如何执行操作的更详细教程,请查看链接。

编辑:

你可以简单地尝试这样的东西,看看是否一切正常,然后转移到自定义列:

<DataGrid ItemsSource="{Binding DownloadsCollection}" />

WPF中的Datagrid绑定检查此答案。 基本上您需要添加ItemSource绑定,以便您的网格知道datacontext。

您需要为datagrid columns添加绑定,因此它知道要显示的内容。 希望这有帮助。

此外,如果需要,您可能需要为DownloadsCollectionbinding mode添加setter 如果您需要更新,这会很有帮助。

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

希望它对你有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM