Wpf RadGridView动态添加列和列组线程问题

Wpf RadGridView动态添加列和列组线程问题,wpf,telerik,radgridview,dynamic-columns,Wpf,Telerik,Radgridview,Dynamic Columns,我正在尝试创建包含静态和动态列的网格。 动态列应位于ColumnGroups下。 当我不使用ColumnGroup时,一切正常。但当我尝试将动态列分配给其中一个组时,我得到 调用线程无法访问此对象,因为其他线程拥有它 我在单独的线程中创建新窗口 Thread newWindowThread=new Thread(new ThreadStart(() => { var instrumentWindow=new InstrumentWindow();

我正在尝试创建包含静态和动态列的网格。 动态列应位于ColumnGroups下。 当我不使用ColumnGroup时,一切正常。但当我尝试将动态列分配给其中一个组时,我得到

调用线程无法访问此对象,因为其他线程拥有它

我在单独的线程中创建新窗口

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)
        });
实际上是负责创建动态列的函数

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]
            });
        }

    }
private void InitDynamicColumns()
{
var maxTermCount=((InstrumentWindowViewModel)this.DataContext).Events.Max(x=>x.Terms.Length);
var termHeaders=新列表();
对于(int i=0;i
当我不使用ColumnGroups时,一切正常。但是当我尝试将ColumnGroup分配到列时,我得到了这个线程异常


感谢您的帮助。

如果您选择在一个线程上创建窗口,而在另一个线程上创建列,则无法在该窗口的控件中显示列

忘记这一点吧,因为它因线程关联而无法工作:

您必须在与创建列的线程相同的线程上创建窗口,这通常是主(UI)线程


WPF控件只能在最初创建它的线程上访问。

不要认为这是原因。正如我在ModalWindow代码中对控件进行的所有操作一样。对于动态列,一切都很完美。当我尝试创建和分配ColumnGroup时,它开始失败。这很奇怪,你不认为是什么原因吗?首先,为什么要在背景线程上创建窗口?显然,如果在同一个线程上创建所有控件,则不会出现任何跨线程错误。我需要从主窗口创建几个独立的窗口。每个窗口都将获得独立的数据,而不会再次阻塞主窗口:您不能在一个线程上创建UI对象,然后在另一个线程上创建的控件中使用它。仅仅因为你“不认为这是原因”,我担心这不会改变。没关系。我找到了解决办法。我根本不需要另一个线程。我创建新线程的整个“阻塞”问题是通过使用Show()而不是ShowDialog()方法解决的:)再次感谢您的帮助)