从Task填充数据网格时出错。 WPF。 C#

时间:2018-02-22 11:34:24

标签: c# wpf wpfdatagrid

这是我第一次在这个论坛上提问。 我正在开发我的第一个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

  

块引用

0 个答案:

没有答案