[英]Bind Objects of ObservableCollection to a DataGrid c#.net
我在WPF中遇到问题。
我有一个像这样的DataGrid:
DataGrid Grid.Row="0" x:Name="DataGridOverview" MinHeight="250" MinWidth="705"
ItemsSource="{Binding}" Style="{StaticResource DataGridStyle}" >
<DataGrid.Columns>
<DataGridTextColumn Width="*" MinWidth="100" Header="Name" Binding="{Binding (clientsideFileManager:CfmModel+FileInformationForOverview.Name)}" />
<DataGridTextColumn Width="1*" MinWidth="50" Header="Größe" Binding="{Binding (clientsideFileManager:CfmModel+FileInformationForOverview.HumanReadableSize)}" />
<DataGridTextColumn Width="1*" MinWidth="70" Header="Typ" Binding="{Binding (clientsideFileManager:CfmModel+FileInformationForOverview.Type)}" />
<DataGridTextColumn Width="1*" MinWidth="70" Header="Status" Binding="{Binding (clientsideFileManager:CfmModel+FileInformationForOverview.Status)}"/>
<DataGridTemplateColumn Header="Progress" Width="1*" MinWidth="70">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ProgressBar Name="progressBar"
Value="{Binding Path=(clientsideFileManager:CfmModel+FileInformationForOverview.ProgressValue), Mode=OneWay, UpdateSourceTrigger=LostFocus}"
Minimum="0" Maximum="100" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Width="30" MinWidth="50" Header="%" Binding="{Binding (clientsideFileManager:CfmModel+FileInformationForOverview.ProgressValue)}" />
<DataGridHyperlinkColumn Width="320" Header="Deeplink" Binding="{Binding (clientsideFileManager:CfmModel+FileInformationForOverview.Deeplink)}">
<DataGridHyperlinkColumn.ElementStyle>
<Style>
<EventSetter Event="Hyperlink.Click" Handler="DG_Hyperlink_Click"/>
</Style>
</DataGridHyperlinkColumn.ElementStyle>
</DataGridHyperlinkColumn>
</DataGrid.Columns>
</DataGrid>
绑定到DataGrid的类为:
public class FileInformationForOverview
{
public int IdOnList { get; set; }
public String Name { get; set; }
public Int64 Size { get; set; }
public String HumanReadableSize { get; set; }
public String Path { get; set; }
public String Type { get; set; }
public int ProgressValue { get; set; }
public long JobId { get; set; }
public Boolean IsChecked { get; set; }
public cfmData CfmData { get; set; }
public bool Paused { get; set; }
public String Deeplink { get; set; }
public String Status { get; set; }
public String LastStatus { get; set; }
}
在列表中:
public readonly ObservableCollection<CfmModel.FileInformationForOverview> OverviewList =
new ObservableCollection<CfmModel.FileInformationForOverview>();
列表在我的MainWindow.xaml.cs中,类FileInformationForOverview在另一个类(CFMModel.cs)中
它是一个上传数据的软件。 用户应该在DataGrid中看到每个文件的进度。
我的问题是,我希望每次更改进度时都更新进度。
当我在Web上阅读时,每次更改绑定时,DataGrid列都应更新。 我的装订错误吗?
到目前为止,我得到了这样的刷新:
public void model_OnProgressUpdate()
{
Dispatcher.BeginInvoke(new Action (()=>DataGridOverview.Items.Refresh()));
Dispatcher.BeginInvoke(new Action(() => DataGridOverview.Focus()));
}
但这会完全阻塞GUI,直到上载完成。
编辑:我的代码更改为以下:
数据网格:
<DataGrid Grid.Row="0" x:Name="DataGridOverview" MinHeight="250" MinWidth="705"
ItemsSource="{Binding OverViewList}" Style="{StaticResource DataGridStyle}" >
<DataGrid.Columns>
<DataGridTextColumn Width="*" MinWidth="100" Header="Name" Binding="{Binding Path=(clientsideFileManager:CfmModel+FileInformationForOverview.Name),UpdateSourceTrigger=PropertyChanged}" />
<DataGridTextColumn Width="1*" MinWidth="50" Header="Größe" Binding="{Binding Path=(clientsideFileManager:CfmModel+FileInformationForOverview.HumanReadableSize),UpdateSourceTrigger=PropertyChanged}" />
<DataGridTextColumn Width="1*" MinWidth="70" Header="Typ" Binding="{Binding Path=(clientsideFileManager:CfmModel+FileInformationForOverview.Type),UpdateSourceTrigger=PropertyChanged}" />
<DataGridTextColumn Width="1*" MinWidth="70" Header="Status" Binding="{Binding Path=(clientsideFileManager:CfmModel+FileInformationForOverview.Status),UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTemplateColumn Header="Progress" Width="1*" MinWidth="70">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ProgressBar Name="progressBar"
Value="{Binding Path=(clientsideFileManager:CfmModel+FileInformationForOverview.ProgressValue), Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
Minimum="0" Maximum="100" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Width="30" MinWidth="50" Header="%" Binding="{Binding (clientsideFileManager:CfmModel+FileInformationForOverview.ProgressValue),UpdateSourceTrigger=PropertyChanged}" />
<DataGridHyperlinkColumn Width="320" Header="Deeplink" Binding="{Binding (clientsideFileManager:CfmModel+FileInformationForOverview.Deeplink),UpdateSourceTrigger=PropertyChanged}">
<DataGridHyperlinkColumn.ElementStyle>
<Style>
<EventSetter Event="Hyperlink.Click" Handler="DG_Hyperlink_Click"/>
</Style>
</DataGridHyperlinkColumn.ElementStyle>
</DataGridHyperlinkColumn>
</DataGrid.Columns>
</DataGrid>
带有要在DataGrid中显示的对象的类(在CFMModel.cs类中):
public class FileInformationForOverview : INotifyPropertyChanged
{
public int IdOnList { get; set; }
public String Name { get; set; }
public Int64 Size { get; set; }
public String HumanReadableSize { get; set; }
public String Path { get; set; }
public String Type { get; set; }
public long JobId { get; set; }
public Boolean IsChecked { get; set; }
public cfmData CfmData { get; set; }
public bool Paused { get; set; }
public String Deeplink { get; set; }
public String Status { get; set; }
public String LastStatus { get; set; }
private int _progressValue;
public int ProgressValue
{
get { return _progressValue; }
set
{
_progressValue = value;
OnPropertyChanged("ProgressValue");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
以及存储对象的列表(在MainWindow.xam.cs中):
public BindingList<CfmModel.FileInformationForOverview> _overviewList
=
new BindingList<CfmModel.FileInformationForOverview>();
DataGridOverview.DataContext = this;
DataGridOverview.ItemsSource = OverviewList;
DataGridOverview.ItemsSource = _overviewList;
public BindingList<CfmModel.FileInformationForOverview> OverviewList
{
get { return _overviewList; }
set { _overviewList = value; }
}
现在没有任何例外,但也没有刷新。
我所做的只是在块完成上传后对FileInformationForOverview.ProgresValue +1进行计数。
尝试像这样实现您的数据类:这应该可以工作,而且我还假设您的实际工作必须在其他线程中完成:
await Task.Run(()=> Calculate());
这是班
public class FileInformationForOverview : INotifyPropertyChanged
{
public int IdOnList { get; set; }
public String Name { get; set; }
public Int64 Size { get; set; }
public String HumanReadableSize { get; set; }
public String Path { get; set; }
public String Type { get; set; }
public long JobId { get; set; }
public Boolean IsChecked { get; set; }
public cfmData CfmData { get; set; }
public bool Paused { get; set; }
public String Deeplink { get; set; }
public String Status { get; set; }
public String LastStatus { get; set; }
private int _progressValue;
public int ProgressValue
{
get { return _progressValue; }
set
{
_progressValue = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.