Toggle Column Visibility Change with Text Block in Header results in error

Dec 15, 2009 at 7:33 PM

I create a column dynamically with the following code:

 

DataGridTextColumn col = new DataGridTextColumn();
TextBlock text = new TextBlock(new Run("Header"));
col.Header = text;
//col.Header = "Header";
grid.Columns.Add(col);

When I toggle visibility from Visible to Hidden and backwards I receive the following error: "Specified element is already the logical child of another element. Disconnect it first.".

All is well when using just a text instead of a TextBlock (the commented line).

 

Am I doing something wrong here or is this a bug?

Frank

Dec 30, 2009 at 3:21 PM

I am having the same problem. Have you found a workaround yet for this problem?

Thanks in advance

Dec 30, 2009 at 3:42 PM

The same problem arises when you create many columns in code btw.

Yep I used a different approach (which works here) using headerbinding.

The code:

Style headerStyle = (Style)Resources["ColumnHeaderStyle"];
DataGridTextColumn col = new DataGridTextColumn();
myColumnInfo colInfo = new myColumnInfo(...);
col.HeaderStyle = headerStyle;
col.Header = colInfo;
Binding visiblityBinding = new Binding("ColVisibility");
visiblityBinding.Source = colInfo;
BindingOperations.SetBinding(col, DataGridTextColumn.VisibilityProperty, visiblityBinding);

The Class:

[Serializable]
    public class myColumnInfo : INotifyPropertyChanged
    {        
        public string Name { get; set; }
        private Visibility colVisibility;
        public myColumnInfo()
            : base()
        {
            // for serialisation
        }
        public myColumnInfo(...)
        {           
            Name = name;
            colVisibility = Visibility.Visible;
        }
        public Visibility ColVisibility
        {
            get { return colVisibility; }
            set
            {
                if (colVisibility != value)
                {
                    colVisibility = value;
                    NotifyPropertyChanged("ColVisibility");
                }
            }
        }
        [field: NonSerialized]
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this,
                  new PropertyChangedEventArgs(propertyName));
            }
        }
    }

And the xaml:

<Style x:Key="ColumnHeaderStyle" TargetType="dg:DataGridColumnHeader">
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <StackPanel>                                
                                <TextBlock Text="{Binding Name}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                            </StackPanel>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

 

 

Dec 31, 2009 at 1:26 AM

Hi All,

Is it similar to this problem?

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=520201

Dec 31, 2009 at 8:25 AM

It looks the same.

I do have EnableColumnVirtualization=true in my code.