RadGridView 动态添加 Columns 和 ColumnGroups 线程问题
RadGridView Dynamic adding Columns and ColumnGroups thread issue
我正在尝试创建包含静态和动态列的网格。
动态列应位于 ColumnGroups 下。
当我不使用 ColumnGroups 时,一切正常。但是当我尝试将动态列分配给其中一个组时,我得到
The calling thread cannot access this object because a different thread owns it.
我在单独的线程
中创建新的window
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 时,一切都像 expected.But 当我尝试将 ColumnGroup 分配给 Column 时,我得到这个线程异常。
感谢您的帮助。
如果您打算在 window 内的控件中显示列,则不能在一个线程上创建 window 而在另一个线程上创建列。
忘记这个吧,因为它因为线程关联而不起作用:
Why do UI Controls in WPF have Thread Affinity?
您必须在与创建列的线程相同的线程上创建 window,这通常是主 (UI) 线程。
只能在最初创建它的线程上访问 WPF 控件。
我正在尝试创建包含静态和动态列的网格。 动态列应位于 ColumnGroups 下。 当我不使用 ColumnGroups 时,一切正常。但是当我尝试将动态列分配给其中一个组时,我得到
The calling thread cannot access this object because a different thread owns it.
我在单独的线程
中创建新的windowThread 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 时,一切都像 expected.But 当我尝试将 ColumnGroup 分配给 Column 时,我得到这个线程异常。
感谢您的帮助。
如果您打算在 window 内的控件中显示列,则不能在一个线程上创建 window 而在另一个线程上创建列。
忘记这个吧,因为它因为线程关联而不起作用:
Why do UI Controls in WPF have Thread Affinity?
您必须在与创建列的线程相同的线程上创建 window,这通常是主 (UI) 线程。
只能在最初创建它的线程上访问 WPF 控件。