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 控件。