您能否给我一个如何将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?提供一个关于这个主题的提示。我赦免了我糟糕的英语。
答案 0 :(得分:8)
您应该可以使用网格的ItemsSource
属性并引用您的集合(可能位于您的视图模型中),如下所示:
ItemsSource="{Binding Path=DownloadsCollection}"
然后在列上添加一个绑定,以显示集合中MyClass
个对象的信息(属性)。
有关如何操作的详细教程,请查看this链接。
修改强>
您可以尝试这样的方法来查看一切是否正常,然后转到自定义列:
<DataGrid ItemsSource="{Binding DownloadsCollection}" />
答案 1 :(得分:1)
Datagrid binding in WPF检查这个答案。
基本上您需要添加ItemSource
绑定,以便您的网格知道datacontext。
您需要为datagrid columns
添加绑定,因此它知道要显示的内容。
希望这有帮助。
此外,如果需要,您可能需要为setter
和DownloadsCollection
添加binding mode
。如果您需要更新,这会很有帮助。
答案 2 :(得分:1)
<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;
答案 3 :(得分:0)
您可以像这样填充动态数据网格:
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>
希望它对你有用。