0
我正在研究带有telerik控件的WPF
应用程序。并发多线程C#
我正在使用RadListBox
,它绑定到集合。当我选择每个RadListBoxItem
时,BindedItem的详细视图将显示在附近的面板中。一次只能选择一个RadListBoxItem
。
在下面的逻辑我正在做了以下功能,
- 编辑
- 转为新
- 快讯保存或放弃
- 保存/放弃
- 负载所选
现在的问题是当警报引发S ave/Discard,如果我点击保存,则启动保存过程,但在保存完成之前,加载也在另一个线程中运行。我必须检查保存是否完成并开始加载过程。
// XAML代码:
<telerik:RadListBox x:Name="lstMarketSeries" ItemsSource="{Binding SCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, ValidatesOnDataErrors=True}" SelectedItem="{Binding SelectedMSeries, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" telerik:StyleManager.Theme="Windows8">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding LoadSelected}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</telerik:RadListBox>
//视图模型:
public ICommand LoadSelected { get { return new RelayCommand(LoadSelectedSDetails); } }
/// <summary>
/// Load selected series
/// </summary>
private async void LoadSelectedSDetails()
{
if (SCollection != null)
{
if (!IsChanged())
{
bw = new BackgroundWorker();
bw.RunWorkerAsync();
bw.DoWork += (s, e) =>
{
//Loading functionality here(Have to check if the save is complete)
};
bw.RunWorkerCompleted += (s, e) =>
{
IsBusy = false;
};
}
else
{
await PutTaskDelay(); // This delay is to wait for save to complete
LoadSelectedSDetails();
}
/// <summary>
/// Check if collection is changed
/// </summary>
private bool IsChanged()
{
bool IsChanged = false;
if (SCollection != null)
IsChanged = SCollection.Where(x => x.IsChanged || x.IsNew).Count() > 0;
if (IsChanged)
{
if (ShowMessages.SaveOrDiscardBox())
{
SaveAllDetails(); // Saving runs in a separate thread.
}
else
{
//Discard functionality goes here
}
}
return IsChanged;
}
在这个问题请帮助。
我想你混淆'ListBoxItem'与列表框本身。如果您的集合中有10个项目,则不会创建10个列表框,而是在单个列表框中创建10个列表框项目。 –
@SriramSakthivel:是的,谢谢。已经更新了这个问题。 – iamCR
只需删除使执行同步的'async/await'。如果您不想阻止UI,请使用相同的'WorkerThread'一个接一个地运行Action,并使用'Dispatcher'进行UI更新。另一种选择是[Backgroung Worker](http://stackoverflow.com/a/5483644/2819451) – Gopichandar