这是我第一次在这个论坛上提问。 我正在开发我的第一个WPF应用程序,该应用程序从ASYNC方法获取数据,以便在它工作时显示一个微调器。
我没做任何问题(称为CheckServices()填充标签,TextBlocks中的数据....),但我做了第二个方法(称为FillDataGrid(()填充DataGrid中的数据)时出错。
我来自Web应用程序,我不确定我是否正常使用Ajax调用。
我的主视图:
public MainViewController()
{
InitializeComponent();
InitializeElements();
FillDataGrid(() =>
{
return new ItemService().ReadItemsByUser(SessionData.UserCertificate.User.DNI);
});
CheckServices();
Title = SessionData.AppData.AppName + " v" + SessionData.AppData.AppVersion;
Show();
}
这是运作良好的方法:
async private void CheckServices()
{
//Show spinner
icoWorking.Visibility = Visibility.Visible;
List<ServiceModel> services =//From other method
Task<List<ServiceModel>> task = Task.Run(()=> {
foreach (ServiceModel ser in services)
{
//A proccess
}
return services;
});
services = await task;
// A process to asign data to view elements
//Hide spinner
icoWorking.Visibility = Visibility.Hidden;
}
这是破解app的方法:
async private void FillDataGrid(Func<List<ItemRepositoryDTO>> p)
{
List<RepositoryModel> list = null;
//Show spinner
icoWorking.Visibility = Visibility.Visible;
List<ItemRepositoryDTO> items = p();
if (items != null)
{
Task<List<RepositoryModel>> task = Task.Run(() =>
{
List<RepositoryModel> listAux = new List<RepositoryModel>();
//A proccess with "items"
return listAux;
});
list = await task;
//Problematic sentence ****
dgRepositoryItems.ItemsSource = list;
//*****
}
//Hide spinner
icoWorking.Visibility = Visibility.Hidden;
}
如果我评论&#34;有问题的句子&#34;,它运作良好,否则当方法结束时(而不是当项目被分配给DataGrid时)会出现错误。如果我不使用异步方法,它运行良好但旋转器不显示。 尝试在MainWindow中尝试Task.WaitAll(t)/Task.WhenAll(t)+ t.Result但该方法总是破坏应用程序而不会通过&#34; catch&#34;。
XAML看起来像这样:
<DataGrid CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserSortColumns="False" ItemsSource="{Binding RepositoryModel}" x:Name="dgRepositoryItems" AutoGenerateColumns="False" BorderBrush="{x:Null}" Margin="0,60,0,41" Background="#FFECECEC">
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Background" Value="#FF50B262"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Nombre" IsReadOnly="True" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<StackPanel.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Margin" Value="5,0,0,0"/>
</Style>
</StackPanel.Resources>
<fa:ImageAwesome Visibility="{Binding ShowRootPath}" VerticalAlignment="Bottom" Height="14" Icon="ArrowCircleOutlineRight" Foreground="Black" />
<TextBlock Text="{Binding GridTab}" />
<fa:ImageAwesome VerticalAlignment="Bottom" Height="14" Icon="{Binding IconPath}" Foreground="Gray" />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn IsReadOnly="True" Width="*" Header="Repositorio" Binding="{Binding Repository}" />
<DataGridTemplateColumn Header="Estado" IsReadOnly="True" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<StackPanel.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Margin" Value="5,0,0,0"/>
</Style>
</StackPanel.Resources>
<fa:ImageAwesome VerticalAlignment="Bottom" Height="14" Icon="{Binding IconState}" Foreground="{Binding IconStateColor}" />
<TextBlock Text="{Binding State}" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
有人可以告诉我我做错了什么,还有一个简单的例子,说明应该怎么做?
提前致谢
更新
问题似乎是另一回事:
在准备要插入DataGrid的数据的任务中,我填充了一个类SolidColorBrush
的字段。
似乎无法在其他线程中创建,而不是在UI中创建。
使用Brush
代替SolidColorBrush
解决了问题。
我找到了解决方案here
块引用