Все еще не уверен, чего вы на самом деле пытаетесь достичь, но самый простой способ (с 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].
Разработчик 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;
}
}
Я лично использовал бы заметный набор для своего источника данных. Существует много примеров там, но по существу Ваш код выглядел бы примерно так. Я не протестировал этот код. Добавьте некоторые комментарии, если у Вас есть какие-либо проблемы.
Здесь существует два основных момента. Один, не загружайте данные, если Ваш не в режиме проектирования, (Вы могли поместить и еще оператор и загрузить тупик ПОСТЕПЕННО данные при необходимости в поддержке разработки). Два, необходимо загрузить данные по отдельному потоку затем поток 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);
}
}
}