В настоящее время невозможно изменить логические дочерние элементы для этого узла, поскольку выполняется обход дерева. - PullRequest
3 голосов
/ 18 сентября 2011

У меня есть две диаграммы набора инструментов wpf, одна из которых представляет собой круговую диаграмму, а вторая серия столбцов

У меня есть метод, который я вызываю только при загрузке формы

 chartGuest.DataContext = null;
            List<KeyValuePair<string, int>> valueList = new List<KeyValuePair<string, int>>();
            HProDataContext db = new HProDataContext();

            var _RoomTypes = (from d in db.roomtypes select d.roomtype1).ToList();
            var _RoomTypeID = (from d in db.roomtypes select d.id).ToList();
            int count = 0;

            for (int i = 0; i < _RoomTypeID.Count; i++)
            {
                count = Convert.ToInt32((from d in db.actions where d.room.roomtypeid == _RoomTypeID[i] select d.id).Count());
                valueList.Add(new KeyValuePair<string, int>(_RoomTypes[i], count));

            }
            chartGuest.DataContext = valueList;

Выдает такую ​​ошибку: Невозможно изменитьлогические потомки для этого узла в это время, потому что идет обход дерева.

Тот же код отлично работает на круговой диаграмме.

Это мои диаграммы:

 <charting:Chart x:Name="chartRoomType" Width="402" Height="255" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="15,275,0,0">
            <charting:Chart.Series>
                <charting:PieSeries ItemsSource="{Binding}" DependentValuePath="Value" IndependentValuePath="Key" Title="Room Types" IsSelectionEnabled="True" />
            </charting:Chart.Series>
                    </charting:Chart>
                    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="314,292,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click"  />
                    <TextBlock Height="23" HorizontalAlignment="Left" Margin="28,296,0,0" Name="textBlock4" Text="Room Types" VerticalAlignment="Top" />
                        <charting:Chart x:Name="chartGuest" Height="269" VerticalAlignment="Top" Margin="6,0" Title="Guests">
                            <charting:Chart.Series>
                                <charting:BarSeries ItemsSource="{Binding}" DependentValuePath="Value" IndependentValuePath="Key" Title="Room Types" IsSelectionEnabled="True" />
                            </charting:Chart.Series>
                        </charting:Chart>

Кто-нибудь может мне помочь?Ps я нашел этот вопрос, но он был бесполезен Что не может изменить логические дочерние элементы для этого узла в это время, потому что идет обход дерева?

Ответы [ 3 ]

1 голос
/ 19 сентября 2011

Используйте DataPointSeries.ItemsSource для привязки к контексту данных.

Предполагая, что это XAML панели вашего окна, в которой сетка данных и элемент управления диаграммами имеют общий список ItemsSource ..

  <StackPanel>
    <tk:DataGrid MaxHeight="200" AutoGenerateColumns="False"
                 ItemsSource="{Binding}"
                 IsReadOnly="True">
        <tk:DataGrid.Columns>
            <tk:DataGridTextColumn Header="Key"
                                   Binding="{Binding Key, Mode=OneWay}"/>
            <tk:DataGridTextColumn Header="Value"
                                   Binding="{Binding Value, Mode=OneWay}"/>
        </tk:DataGrid.Columns>
    </tk:DataGrid>

    <charting:Chart MaxHeight="300"
                    Title="Title"
                    LegendTitle="Legend"
                    Name="Chart1">
        <charting:AreaSeries DependentValuePath="Value"
                             IndependentValuePath="Key"
                             Background="Red" >
            <charting:DataPointSeries.ItemsSource>
                <Binding BindsDirectlyToSource="True"/>
            </charting:DataPointSeries.ItemsSource>
        </charting:AreaSeries>
    </charting:Chart>

    <Button Content="Change DataGrid and Chart Data" Click="Button_Click"/>
</StackPanel>

В коде позади мы сбрасываем контекст данных окна ....

    private List<KeyValuePair<int, int>> list1;

    public Window1()
    {
        InitializeComponent();

        list1 = new List<KeyValuePair<int, int>>();
        var random = new Random();
        for(int i = 0; i < 1000; i++)
        {
            list1.Add(new KeyValuePair<int, int>(i, random.Next()));
        }

        this.DataContext = list1;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        list1 = new List<KeyValuePair<int, int>>();
        var random = new Random();
        for (int i = 0; i < 1000; i++)
        {
            list1.Add(new KeyValuePair<int, int>(i, random.Next()));
        }

        this.DataContext = list1;
    }

Каждый раз, когда вы нажимаете кнопку, диаграмма обновляется без ошибок.

Дайте мне знать, если это поможет.

0 голосов
/ 13 января 2016

Я знаю, что это было какое-то время, но в случае, если кто-то еще сталкивался с этим, я нашел другой способ обойти это.Поместите диаграмму в StackPanel, созданную с видимостью «Collapsed» («Hidden» НЕ РАБОТАЕТ).Затем установите видимость «Видимый» после установки DataContext в первый раз (я делаю это каждый раз, но после первого это избыточно).

Мой опыт согласуется с отчетами, которые я видел, что проблемаошибка, возникающая при установке непустого DataContext после наличия пустого;но, очевидно, это не делает "прогулку по дереву", если диаграмма свернута.

0 голосов
/ 19 февраля 2015

Я получил одно и то же исключение в другой ситуации.Я работаю с кодом, который берет коллекцию существующих элементов UIElement, создаю новый элемент UIElement и устанавливаю первый в качестве содержимого второго.Кроме того, он берет значение свойства из существующего UIElement и устанавливает его как значение другого свойства нового UIElement.

foreach(UIElement insideElement in uiElementCollection)
{
    var outsideElement = new TabItem
    {
         Content = insideElement
         ,Header = insideElement.Title
    }
}

Но в этом случае заголовок свойства inside может быть Binding, но код выше копирует только значение икогда insideElement.Title привязан к какому-либо источнику, outsideElement.Header не отражает изменения.Поэтому я изменил код для привязки HeaderProperty к TitleProperty insideElement:

foreach(UIElement insideElement in uiElementCollection)
{
    var outsideElement = new TabItem
    {
         Content = insideElement
    }

    outsideElement.SetBinding(HeaderedContentControl.HeaderProperty,
                        new Binding
                        {
                            Source = insideElement,
                            Path = new PropertyPath(MyUIElement.TitleProperty)
                        });
}

Но когда я выполнил код выше, я получил

System.InvalidOperationException: не могу изменить логические дочерние элементы для этогоузел в это время, потому что идет обход дерева.

Я обнаружил, что не могу связать одно свойство зависимости с другим, которое хранится внутри свойства Content.

Iпопытался получить выражение привязки innerUIElement и установить его в качестве новой привязки к HeaderProperty для outsideUIElement.

foreach(UIElement insideElement in uiElementCollection)
{
    var outsideElement = new TabItem
    {
         Content = insideElement
    }

    BindingExpression titleBindingExpression = pageControl.GetBindingExpression(MyUIElement.TitleProperty);
        if (titleBindingExpression != null)
            {                            
                tabItem.SetBinding(HeaderedContentControl.HeaderProperty, new Binding { Source = titleBindingExpression.DataItem, Path = titleBindingExpression.ParentBinding.Path });

            }
            else
            {
                tabItem.Header = innerUIElement.Title;
            }
}

Теперь внешний элемент пользовательского интерфейса привязан к тому же источнику, и презентатор WPF не вызывает исключение.Моя проблема решена.

...