WPF: Загрузка данных в конструкторе UserControl повреждает Разработчика

Все еще не уверен, чего вы на самом деле пытаетесь достичь, но самый простой способ (с C ++ 11 или более поздней версии) ссылаться на дополнительные объекты в вашем двоичном функторе - это использовать лямбда-выражение:

result = spinCGPart.col(0).binaryExpr(spinCGPart.col(1), 
           [&](int a, int b){return generalExpVal(a,b,mat);});

Полностью скомпилированный пример: https://godbolt.org/z/PBJJRW

С C ++ 03 вы можете сделать это вручную, используя вспомогательную структуру или используя, например, [ 111].

7
задан bendewey 21 February 2009 в 00:52
поделиться

2 ответа

Разработчик WPF выполнит конструктора на дочерних элементах при отображении их. Мое предположение - то, что у Вас есть код в конструкторе, который выдает исключение во время проектирования, вероятно, потому что он использует объект, это только доступно во времени выполнения. Решение состояло бы в том, чтобы окружить Вашу логику конструктора проверкой, чтобы препятствовать тому, чтобы он выполнился, в то время как это отображается в разработчике.

if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
{
  using (var context = new Data.TVShowDataContext())
  {
    var list = from show in context.Shows
               select show;

    listShow.ItemsSource = list;
  }    
}
13
ответ дан 6 December 2019 в 15:32
поделиться

Я лично использовал бы заметный набор для своего источника данных. Существует много примеров там, но по существу Ваш код выглядел бы примерно так. Я не протестировал этот код. Добавьте некоторые комментарии, если у Вас есть какие-либо проблемы.

Здесь существует два основных момента. Один, не загружайте данные, если Ваш не в режиме проектирования, (Вы могли поместить и еще оператор и загрузить тупик ПОСТЕПЕННО данные при необходимости в поддержке разработки). Два, необходимо загрузить данные по отдельному потоку затем поток UI.

Обновленный

Было несколько обновлений кода. Я изменился (новый поток) на использование QueueUserWorkItem, я изменил метод AddItems, потому что ObservableCollection не поддерживает AddRange, и я изменил написание на IEnumerable

public class TvShowsDataSource
{
    public ObservableCollection<Show> Shows { get; set; }

    private void AddItems(IEnumerable<Show> shows)
    {
            foreach(var show in shows)
                   Shows.Add(show);
    }

    public void LoadShowsAsync(Dispatcher dispatcher)
    {
            ThreadPool.QueueUserWorkItem((state) =>
                   LoadShows(dispatcher));
    }

    private void LoadShows(Dispatcher dispatcher)
    {
        if (dispatcher == null)
            throw new ArgumentNullException("dispatcher");

        using (var context = new Data.TVShowDataContext())
        {
            var list = from show in context.Shows
                       select show;

            dispatcher.Invoke(AddItems(list));
        }
    }
}

public class UserControl1
{
    private readonly TvShowsDataSource tvShowsDataSource;

    public UserControl1() : this(new TvShowsDataSource()) {}

    public UserControl1(TvShowsDataSource tvShowsDataSource )
    {
        InitializeComponent();
        this.tvShowsDataSource = tvShowsDataSource;
        listShow.ItemsSource = tvShowsDataSource.Shows;
        this.Loaded += UserControl1_Loaded;
    }

    public void UserControl1_Loaded(object sender, RoutedEventArgs e)
    {
        if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
        {
            tvShowsDataSource.LoadShowsAsync(this.Dispatcher);
        }
    }
}
1
ответ дан 6 December 2019 в 15:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: