2015-10-16 3 views
-1

У меня есть функция «импорта XLSX» на главном окне моего приложения, которое возвращает объект с результатом импорта информации, и я запустить эту функцию из задачи, как этотПоказать окно WPF внутри задачи

var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); 

System.Threading.Tasks.Task.Run(() => 
{ 
    result = XlsxImport.Import(openFileDialog.FileName); 
    return result; 
}) 
.ContinueWith(r => 
{ 
    if (r.Result.Errors.Count > 0) 
    { 
     if (MessageBox.Show("Import finished with " + r.Result.Errors.Count.ToString() + " errors. An error list will be shown.", "Errors occurred during import", MessageBoxButton.OKCancel) == MessageBoxResult.OK) 
     { 
      ImportErrorsView importErrorWindow = new ImportErrorsView(r.Result); 
      importErrorWindow.Show(); 
     } 
    } 
    else 
    { 
     MessageBox.Show("Import succesfully completed"); 
    } 
}, scheduler); 

importErrorWindow это просто окно с сеткой, где я связываю список ошибок.

НО, когда отображается importErrorWindow, сетка содержит правильное количество строк, но все они пустые, а в консоли я вижу только ошибки связывания, в то время как я на 100% уверен, что привязки верны (i проверено отладки шаг за шагом)

Я также попытался удалить Колум привязок и установите свойство AutoGenerateColums сетки Верно, но результат тот же: правильное число строк, но все пустое

почему это происходит? это связано с задачей?


UPDATE Вот код моего окна

<Window x:Class="MyApp.Module.WBS.Views.ImportErrorsView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" 
     Title="ImportErrorsReport" 
     xmlns:vm="clr-namespace:MyApp.Module.WBS.ViewModels"> 
    <Window.Resources> 
     <vm:WBSImportErrorsViewModel x:Key="WBSImportErrorsViewModel" /> 
    </Window.Resources> 
    <Grid x:Name="MainGrid" DataContext="{StaticResource WBSImportErrorsViewModel}"> 
     <telerik:RadGridView Name="ErrorList" CanUserFreezeColumns="False" CanUserInsertRows="False" GroupRenderMode="Flat" 
            AutoGenerateColumns="False" ItemsSource="{Binding ImportErrors}"         
           ShowGroupPanel="False" EnableRowVirtualization="True" EnableColumnVirtualization="False" 
           FilteringMode="FilterRow" RowIndicatorVisibility="Collapsed" > 
      <telerik:RadGridView.Columns> 
       <telerik:GridViewDataColumn Header="Line" DataMemberBinding="{Binding XlsxLine}" Width="60" /> 
       <telerik:GridViewDataColumn Header="ErrorMessage" DataMemberBinding="{Binding ErrorMessage}" Width="400" /> 
       <telerik:GridViewDataColumn Header="Exception Message" DataMemberBinding="{Binding Exception.Message}" Width="300" /> 
       <telerik:GridViewDataColumn Header="Exception InnerException" DataMemberBinding="{Binding Exception.InnerException}" Width="400" /> 
      </telerik:RadGridView.Columns> 
     </telerik:RadGridView> 
    </Grid> 
</Window> 

namespace MyApp.Module.WBS.Views 
{ 
    public partial class ImportErrorsView : Window 
    { 
     ImportResult ir; 

     public ImportErrorsView() 
     { 
      InitializeComponent(); 
     } 

     public ImportErrorsView(ImportResult ir) 
     {    
      InitializeComponent(); 
      ((WBSImportErrorsViewModel)this.MainGrid.DataContext).ImportErrors = new ObservableCollection<ImportError>(ir.Errors); 
     }   
    } 
} 

модели представления:

namespace MyApp.Module.WBS.ViewModels 
{ 
    public class WBSImportErrorsViewModel : ViewModelBase 
    { 
     private ObservableCollection<ImportError> _importErrors; 
     public ObservableCollection<ImportError> ImportErrors 
     { 
      get 
      { 
       return this._importErrors; 
      } 
      set 
      { 
       this._importErrors = value; 
       this.OnPropertyChanged(() => this.ImportErrors); 
      } 
     } 
    } 
} 

и объект

public class ImportResult 
{ 
    public List<ImportError> Errors; 

    public ImportResult() 
    { 
     //other non-relevant fields 
     Errors = new List<ImportError>(); 
    } 
} 
public class ImportError 
{ 
    public int? XlsxLine; 
    public string ErrorMessage; 
    public Exception Exception; 

    public ImportError(int? xlsxLine, string errorMessage, Exception exception) 
    { 
     XlsxLine = xlsxLine; 
     ErrorMessage = errorMessage; 
     Exception = exception; 
    } 
} 
+2

Какие ошибки привязки вы видите точно? Кроме того, поскольку вы можете использовать 'Task.Run', почему бы просто не написать код' async'/'await', вместо того, чтобы самостоятельно записывать контекст синхронизации? – Dennis

+0

ошибка образца: 'System.Windows.Data Error: 40: Ошибка пути BindingExpression: свойство ErrorMessage не найдено в 'object' '' ImportError '(HashCode = 51100975)'. BindingExpression: Path = ErrorMessage; DataItem = 'ImportError' (HashCode = 51100975); целевым элементом является «GridViewCell» (Name = ''); target свойство 'ValueChangedListener' (type 'Object') ' – Doc

+0

Ну ... ошибка привязки не лежит. :) Введите соответствующие типы данных, разметку и код, который инициализирует контекст данных для 'ImportErrorsView'. Проблема не связана с задачами. – Dennis

ответ

1

Класс ImportError должен иметь поля XlsxLine, ErrorMessage, Exception как свойства. Вы также должны реализовать INotifyPropertyChange, если вы хотите, чтобы отдельные свойства уведомляли сетку о происходящих изменениях.

+0

omg Я забыл установить их как свойства! Спасибо! – Doc

Смежные вопросы