我尝试使用静态和动态列创建网格。 动态列应位于ColumnGroups下。 当我没有使用ColumnGroups时,一切正常。但是当我尝试将动态列分配给其中一个组时,我得到了
调用线程无法访问此对象,因为另一个线程拥有它。
我在单独的线程中创建新窗口
Thread newWindowThread=new Thread(new ThreadStart(() =>
{
var instrumentWindow=new InstrumentWindow();
((InstrumentWindowViewModel)instrumentWindow.DataContext).Initialize(instrument.ToString(),DateTime.Today);
instrumentWindow.Show();
System.Windows.Threading.Dispatcher.Run();
}));
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
newWindowThread.Start();
创建静态列后
this.EventGrid.Columns.Add(new GridViewDataColumn()
{
Header = "Time",
DataMemberBinding = new Binding("Time"),
DataType = typeof(DateTime)
});
实际上是负责创建动态列的函数
基本上,我们的想法是为每个术语创建ColumnGroup,并在该组下显示术语属性。
private void InitDynamicColumns()
{
var maxTermCount = ((InstrumentWindowViewModel)this.DataContext).Events.Max(x => x.Terms.Length);
var termHeaders = new List<string>();
for (int i = 0; i < maxTermCount; i++)
{
var currentTerm = ((InstrumentWindowViewModel)this.DataContext).Events.First().Terms[i];
var analyzerAmountType = currentTerm.Type == AnalyzerAmountType.Seconds ? "sec" : "ticks";
this.EventGrid.ColumnGroups.Add(new GridViewColumnGroup
{
Header = currentTerm.Size + " " + analyzerAmountType + " term",
Name = currentTerm.Size + analyzerAmountType + "term"
});
termHeaders.Add(currentTerm.Size + analyzerAmountType + "term");
}
for (int i = 0; i < maxTermCount; i++)
{
this.EventGrid.Columns.Add(new GridViewDataColumn()
{
Header = "Property1",
DataMemberBinding = new Binding("Terms[" + i + "].Property1"),
ColumnGroupName = termHeaders[i]
});
this.EventGrid.Columns.Add(new GridViewDataColumn()
{
Header = "Property2",
DataMemberBinding = new Binding("Terms[" + i + "].Property2"),
ColumnGroupName = termHeaders[i]
});
this.EventGrid.Columns.Add(new GridViewDataColumn()
{
Header = "Property3",
DataMemberBinding = new Binding("Terms[" + i + "].Property3"),
ColumnGroupName = termHeaders[i]
});
}
}
当我不使用ColumnGroups时,一切都按预期工作。但是当我尝试将ColumnGroup分配给Column时,我得到了这个Thread异常。
感谢您的帮助。
答案 0 :(得分:1)
如果您在该窗口内的控件中显示列,则无法在一个线程上创建窗口而在另一个线程上创建列。
忘记这一点,因为它因线程亲和力而无效:
Why do UI Controls in WPF have Thread Affinity?
您必须在与创建列的线程相同的线程上创建窗口,这通常是主(UI)线程。
WPF控件只能在最初创建它的线程上访问。