Telerik Forums
UI for WPF Forum
2 answers
106 views
I am using the MVVM design pattern and am attempting to add a button to perform an action on all items in a group. I have successfully added the button to the group header template and am attempting to find the view models of the group's rows with the following code:

private void validateGroupButton_Click(object sender, RoutedEventArgs e)
        {
            var sourceUIElement = (UIElement)sender;
            var group = sourceUIElement.ParentOfType<GridViewGroupRow>();
            var collectionViewGroup = (CollectionViewGroup)group.DataContext;
            var grid = sourceUIElement.ParentOfType<RadGridView>();
            var vm = (ManualDealsViewModel)grid.DataContext;
            var toValidate = collectionViewGroup.Items.Cast<ManualDealViewModel>().ToList();
              (.... perform action on toValidate enumeration ...)
            }

This basically works, however the toValidate enumeration only contains the rows that are currently visible in the group. 

Is there a way to retrieve all the view models that match the group, even if they are not presently visible?
David
Top achievements
Rank 1
 answered on 06 Sep 2010
1 answer
126 views
Hi guys.

What would be the best way in xaml to display a RadGridViewColumn only when data is available
e.g.
I have to column in my Radgridview. These columns are binding against an IEnumerable List of Materials (Type: MATERIAL)

If one column doesn not contain any data in all underlying rows, i would like not to display this column. (i only want to display columns with cell values)
How can this be done?
thanks for your help
<DataTemplate>
    <tcg:RadGridView x:Name="RadGridView1" CanUserFreezeColumns="False" AutoGenerateColumns="False" ItemsSource="{Binding MBEP}"  ShowGroupPanel="False" IsReadOnly="True">
        <tcg:RadGridView.Columns            
                <tcg:GridViewDataColumn DataMemberBinding="{Binding MATERIAL.Txt1}" Header="Material Descr."/>
                <tcg:GridViewDataColumn DataMemberBinding="{Binding MATERIAL.MatNr}" Header="Material No" Width="{Binding MATA.MatNr.Length}"/>
        </tcg:RadGridView.Columns>
    </tcg:RadGridView>
</DataTemplate>
Milan
Telerik team
 answered on 06 Sep 2010
2 answers
159 views

I have a RadGridView that is populated dynamically by a data table. Certain columns are calculated from other columns but the calculations are done by my own calculation engine. When one of the underlying columns is changed I pick up the event and check whether it is part of a calculation. If it is then I do the calculation and need to update the relevant cell/s.

 

My problem comes in when wanting to update the cell/s. Right now I am changing the data table data and then binding the data table back to the grid and calling refresh function.

 

DataTable source = ( DataTable ) this.gridLogsheetGrid.ItemsSource;

 

//Change cell data

 

this.gridLogsheetGrid.ItemsSource = source;

this.gridLogsheetGrid.Items.Refresh ( );

 

This works, however it refreshes the entire grid and is therefore expensive and the grid disappears for a second or two.

 

I have read the thread on applying using the INotifyPropertyChanged event but how will I use this on an individual column on a data table?

Chris
Top achievements
Rank 1
 answered on 06 Sep 2010
3 answers
123 views
Hi Team,

How can i expose RadTreeView.SelectedContainer property,  which will return my own custom type instead of RadTreeViewItem?

code:

 

 

public RadTreeViewItem SelectedContainer

 

{

 

 

get { return (RadTreeViewItem)TreeView.GetValue(RadTreeView.SelectedContainerProperty); }

 

 

 

set { TreeView.SetValue(RadTreeView.SelectedContainerProperty, value); }

 

}


instead of the above code i want to write something like this:

 

 

public TngTreeViewItem SelectedContainer

 

{

 

 

get { return (TngTreeViewItem )TreeView.GetValue(RadTreeView.SelectedContainerProperty); }

 

 

 

set { TreeView.SetValue(RadTreeView.SelectedContainerProperty, value); }

 

}

--------------------------------------------------------------------------------------------------------------------------------------------------------------------
TngTreeViewItem.cs

[

 

ContentProperty("Items")]

 

 

 

public class TngTreeViewItem : FrameworkContentElement

 

{

 

 

protected RadTreeViewItem _treeViewItem = new RadTreeViewItem();

 

#region

 

 

Constructors

 

 

 

static TngTreeViewItem()

 

{

DefaultStyleKeyProperty.OverrideMetadata(

 

typeof(TngTreeViewItem), new FrameworkPropertyMetadata(typeof(TngTreeViewItem)));

 

}

#endregion

#region

 

 

Internal Control

 

 

 

public RadTreeViewItem InternalControl

 

{

 

 

get

 

{

 

 

return _treeViewItem;

 

}

}

#endregion

 

#region

 

 

Property: Header

 

 

 

public virtual Object Header

 

{

 

 

get { return GetValue(HeaderProperty); }

 

 

 

set { SetValue(HeaderProperty, value); }

 

}

 

 

public static readonly DependencyProperty HeaderProperty =

 

 

 

DependencyProperty.Register(

 

 

 

"Header", typeof(Object), typeof(TngTreeViewItem),

 

 

 

new FrameworkPropertyMetadata

 

{

PropertyChangedCallback = (obj, e) =>

{

(obj

 

as TngTreeViewItem).UpdateHeader(e.NewValue);

 

}

});

 

 

private void UpdateHeader(Object sel)

 

{

_treeViewItem.Header = sel;

}

#endregion

}
}


Thanks,
-Manjurekar
Hristo
Telerik team
 answered on 06 Sep 2010
6 answers
124 views

The default of the bar series is to put the bar value inside the bar, but if the value is too wide, it gets cut off.  It needs options you can set so you can change the value rotation.  Also, it seems like the bar value should not be placed inside the bar, but outside of it (or make that an option).

I am trying to set the bar template to achieve the effect, but still have some issues with the display.  If I figure it out, I will post back here.  Here is what I have so far:

        <Style TargetType="{x:Type telerik:Bar}">  
            <Setter Property="Template">  
                <Setter.Value> 
                    <ControlTemplate TargetType="{x:Type telerik:Bar}">  
                        <Grid> 
                            <Grid.RowDefinitions> 
                                <RowDefinition Height="Auto"/>  
                            </Grid.RowDefinitions> 
                            <Rectangle Grid.Row="0" Stroke="Red"  VerticalAlignment="Bottom"   
                                HorizontalAlignment="Stretch" StrokeThickness="1" Fill="Coral"   
                                Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ActualHeight}" /> 
                            <TextBlock Grid.Row="0" Foreground="Black" Padding="0,0,0,5"   
                                Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DataPoint.YValue}">  
                                <TextBlock.LayoutTransform> 
                                    <RotateTransform Angle="-90" CenterX="0" CenterY="0"/>  
                                </TextBlock.LayoutTransform> 
                            </TextBlock> 
                        </Grid> 
                    </ControlTemplate> 
                </Setter.Value> 
            </Setter> 
        </Style> 
 
Velin
Telerik team
 answered on 06 Sep 2010
1 answer
615 views
what is the difference between the two?

WPF's DockPanel:

/// <summary> 
/// DockPanel is used to size and position children inward from the edges of available space.
/// 
/// A <see cref="System.Windows.Controls.Dock" /> enum (see <see cref="SetDock" /> and <see cref="GetDock" />) 
/// determines on which size a child is placed.  Children are stacked in order from these edges until
/// there is no more space; this happens when previous children have consumed all available space, or a child 
/// with Dock set to Fill is encountered.
/// </summary>
public class DockPanel : Panel
    //-------------------------------------------------------------------
    // 
    //  Constructors 
    //
    //------------------------------------------------------------------- 
    #region Constructors
    /// <summary> 
    ///     Default DependencyObject constructor
    /// </summary> 
    /// <remarks> 
    ///     Automatic determination of current Dispatcher. Use alternative constructor
    ///     that accepts a Dispatcher for best performance. 
    /// </remarks>
    public DockPanel() : base()
    {
    
    #endregion 
    //--------------------------------------------------------------------
    // 
    //  Public Methods
    //
    //-------------------------------------------------------------------
    #region Public Methods
    /// <summary> 
    /// Reads the attached property Dock from the given element.
    /// </summary> 
    /// <param name="element">UIElement from which to read the attached property.</param>
    /// <returns>The property's value.</returns>
    /// <seealso cref="DockPanel.DockProperty" />
    [AttachedPropertyBrowsableForChildren()] 
    public static Dock GetDock(UIElement element)
    
        if (element == null) { throw new ArgumentNullException("element"); } 
        return (Dock) element.GetValue(DockProperty); 
    }
    /// <summary>
    /// Writes the attached property Dock to the given element. 
    /// </summary>
    /// <param name="element">UIElement to which to write the attached property.</param> 
    /// <param name="dock">The property value to set</param> 
    /// <seealso cref="DockPanel.DockProperty" />
    public static void SetDock(UIElement element, Dock dock) 
    {
        if (element == null) { throw new ArgumentNullException("element"); }
        element.SetValue(DockProperty, dock); 
    }
    private static void OnDockChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    {
        UIElement uie = d as UIElement; //it may be anyting, like FlowDocument... bug 1237275 
        if(uie != null)
        {
            DockPanel p = VisualTreeHelper.GetParent(uie) as DockPanel;
            if(p != null
            {
                p.InvalidateMeasure(); 
            
        }
    
    #endregion
    //-------------------------------------------------------------------- 
    //
    //  Public Properties + Dependency Properties's 
    // 
    //--------------------------------------------------------------------
    #region Public Properties
    /// <summary>
    /// This property controls whether the last child in the DockPanel should be stretched to fill any 
    /// remaining available space.
    /// </summary> 
    public bool LastChildFill 
    {
        get { return (bool) GetValue(LastChildFillProperty); } 
        set { SetValue(LastChildFillProperty, value); }
    }
    /// <summary>
    /// DependencyProperty for <see cref="LastChildFill" /> property. 
    /// </summary> 
    [CommonDependencyProperty]
    public static readonly DependencyProperty LastChildFillProperty = 
            DependencyProperty.Register(
                    "LastChildFill",
                    typeof(bool),
                    typeof(DockPanel), 
                    new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.AffectsArrange));
    /// <summary>
    /// DependencyProperty for Dock property. 
    /// </summary>
    /// <seealso cref="DockPanel.GetDock" />
    /// <seealso cref="DockPanel.SetDock" />
    [CommonDependencyProperty] 
    public static readonly DependencyProperty DockProperty =
            DependencyProperty.RegisterAttached( 
                    "Dock"
                    typeof(Dock),
                    typeof(DockPanel), 
                    new FrameworkPropertyMetadata(
                        Dock.Left,
                        new PropertyChangedCallback(OnDockChanged)),
                    new ValidateValueCallback(IsValidDock)); 
    #endregion 
    //-------------------------------------------------------------------
    // 
    //  Protected Methods
    //
    //--------------------------------------------------------------------
    #region Protected Methods
    /// <summary> 
    /// Updates DesiredSize of the DockPanel.  Called by parent UIElement.  This is the first pass of layout.
    /// </summary> 
    /// <remarks>
    /// Children are measured based on their sizing properties and <see cref="System.Windows.Controls.Dock" />.
    /// Each child is allowed to consume all of the space on the side on which it is docked; Left/Right docked
    /// children are granted all vertical space for their entire width, and Top/Bottom docked children are 
    /// granted all horizontal space for their entire height.
    /// </remarks> 
    /// <param name="constraint">Constraint size is an "upper limit" that the return value should not exceed.</param> 
    /// <returns>The Panel's desired size.</returns>
    protected override Size MeasureOverride(Size constraint) 
    {
        UIElementCollection children = InternalChildren;
        double parentWidth       = 0;   // Our current required width due to children thus far. 
        double parentHeight      = 0;   // Our current required height due to children thus far.
        double accumulatedWidth  = 0;   // Total width consumed by children. 
        double accumulatedHeight = 0;   // Total height consumed by children. 
        for (int i = 0, count = children.Count; i < count; ++i) 
        {
            UIElement child = children[i];
            Size   childConstraint;             // Contains the suggested input constraint for this child.
            Size   childDesiredSize;            // Contains the return size from child measure. 
            if (child == null) { continue; } 
            // Child constraint is the remaining size; this is total size minus size consumed by previous children.
            childConstraint = new Size(Math.Max(0.0, constraint.Width - accumulatedWidth), 
                                       Math.Max(0.0, constraint.Height - accumulatedHeight));
            // Measure child.
            child.Measure(childConstraint); 
            childDesiredSize = child.DesiredSize;
            // Now, we adjust: 
            // 1. Size consumed by children (accumulatedSize).  This will be used when computing subsequent
            //    children to determine how much space is remaining for them. 
            // 2. Parent size implied by this child (parentSize) when added to the current children (accumulatedSize).
            //    This is different from the size above in one respect: A Dock.Left child implies a height, but does
            //    not actually consume any height for subsequent children.
            // If we accumulate size in a given dimension, the next child (or the end conditions after the child loop) 
            // will deal with computing our minimum size (parentSize) due to that accumulation.
            // Therefore, we only need to compute our minimum size (parentSize) in dimensions that this child does 
            //   not accumulate: Width for Top/Bottom, Height for Left/Right. 
            switch (DockPanel.GetDock(child))
            
                case Dock.Left:
                case Dock.Right:
                    parentHeight = Math.Max(parentHeight, accumulatedHeight + childDesiredSize.Height);
                    accumulatedWidth += childDesiredSize.Width; 
                    break;
                case Dock.Top: 
                case Dock.Bottom:
                    parentWidth = Math.Max(parentWidth, accumulatedWidth + childDesiredSize.Width); 
                    accumulatedHeight += childDesiredSize.Height;
                    break;
            }
        
        // Make sure the final accumulated size is reflected in parentSize. 
        parentWidth = Math.Max(parentWidth, accumulatedWidth); 
        parentHeight = Math.Max(parentHeight, accumulatedHeight);
        return (new Size(parentWidth, parentHeight));
    }
    /// <summary> 
    /// DockPanel computes a position and final size for each of its children based upon their
    /// <see cref="System.Windows.Controls.Dock" /> enum and sizing properties. 
    /// </summary> 
    /// <param name="arrangeSize">Size that DockPanel will assume to position children.</param>
    protected override Size ArrangeOverride(Size arrangeSize) 
    {
        UIElementCollection children = InternalChildren;
        int totalChildrenCount = children.Count;
        int nonFillChildrenCount = totalChildrenCount - (LastChildFill ? 1 : 0); 
        double accumulatedLeft   = 0; 
        double accumulatedTop    = 0; 
        double accumulatedRight  = 0;
        double accumulatedBottom = 0; 
        for (int i = 0; i < totalChildrenCount; ++i)
        {
            UIElement child = children[i]; 
            if (child == null) { continue; }
            Size childDesiredSize = child.DesiredSize; 
            Rect rcChild = new Rect(
                accumulatedLeft, 
                accumulatedTop,
                Math.Max(0.0, arrangeSize.Width - (accumulatedLeft + accumulatedRight)),
                Math.Max(0.0, arrangeSize.Height - (accumulatedTop + accumulatedBottom))    );
            if (i < nonFillChildrenCount)
            
                switch (DockPanel.GetDock(child)) 
                {
                    case Dock.Left: 
                        accumulatedLeft += childDesiredSize.Width;
                        rcChild.Width = childDesiredSize.Width;
                        break;
                    case Dock.Right:
                        accumulatedRight += childDesiredSize.Width; 
                        rcChild.X = Math.Max(0.0, arrangeSize.Width - accumulatedRight); 
                        rcChild.Width = childDesiredSize.Width;
                        break
                    case Dock.Top:
                        accumulatedTop += childDesiredSize.Height;
                        rcChild.Height = childDesiredSize.Height; 
                        break;
                    case Dock.Bottom: 
                        accumulatedBottom += childDesiredSize.Height;
                        rcChild.Y = Math.Max(0.0, arrangeSize.Height - accumulatedBottom); 
                        rcChild.Height = childDesiredSize.Height;
                        break;
                }
            
            child.Arrange(rcChild); 
        
        return (arrangeSize); 
    }
    #endregion Protected Methods
    //-------------------------------------------------------------------
    // 
    //  Private Methods 
    //
    //------------------------------------------------------------------- 
    #region Private Methods
    internal static bool IsValidDock(object o) 
    {
        Dock dock = (Dock)o; 
        return (    dock == Dock.Left
                ||  dock == Dock.Top 
                ||  dock == Dock.Right
                ||  dock == Dock.Bottom);
    }
    //
    //  This property 
    //  1. Finds the correct initial size for the _effectiveValues store on the current DependencyObject 
    //  2. This is a performance optimization
    // 
    internal override int EffectiveValuesInitialSize
    {
        get { return 9; }
    
    #endregion Private Methods 
}


RadDockPanel:
/// <summary>
/// Defines an area where you can arrange child elements either horizontally or vertically, relative to each other. 
/// </summary>
[DefaultProperty("LastChildFill")]
public class RadDockPanel : Panel
{
    /// <summary>
    /// Identifies the Dock attached property. 
    /// </summary>
    public static readonly DependencyProperty DockProperty =
        DependencyProperty.RegisterAttached("Dock",
        typeof(Dock),
        typeof(RadDockPanel),
        new System.Windows.PropertyMetadata(Dock.Left, RadDockPanel.OnDockChanged));
    /// <summary>
    /// Identifies the LastChildFill dependency property. 
    /// </summary>
    public static readonly DependencyProperty LastChildFillProperty =
        DependencyProperty.Register("LastChildFill",
        typeof(bool),
        typeof(RadDockPanel),
        new System.Windows.PropertyMetadata(true, RadDockPanel.OnLastChildFillChanged));
    /// <summary>
    /// Initializes a new instance of the <see cref="RadDockPanel"/> class.
    /// </summary>
    public RadDockPanel()
    {
        TelerikLicense.Verify(this);
    }
    /// <summary>
    /// Gets or sets a value that indicates whether the last child element within 
    /// a DockPanel stretches to fill the remaining available space. This is a dependency property.
    /// </summary>
    public bool LastChildFill
    {
        get
        {
            return (bool)GetValue(LastChildFillProperty);
        }
        set
        {
            SetValue(LastChildFillProperty, value);
        }
    }
    /// <summary>
    /// Gets the value of the Dock attached property for a specified UIElement.
    /// </summary>
    /// <param name="element">The element from which the property value is read.</param>
    /// <returns>The Dock property value for the element.</returns>
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters", Justification = "Dock should be used on UIElements only.")]
    public static Dock GetDock(UIElement element)
    {
        if (element == null)
        {
            throw new ArgumentNullException("element");
        }
        return (Dock)element.GetValue(DockProperty);
    }
    /// <summary>
    /// Sets the value of the Dock attached property to a specified element.
    /// </summary>
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters", Justification = "Dock should be used on UIElements only.")]
    public static void SetDock(UIElement element, Dock dock)
    {
        if (element == null)
        {
            throw new ArgumentNullException("element");
        }
        element.SetValue(DockProperty, dock);
    }
    internal static bool IsValidDock(object o)
    {
        Dock dock = (Dock)o;
        if (((dock != Dock.Left) && (dock != Dock.Top)) && (dock != Dock.Right))
        {
            return dock == Dock.Bottom;
        }
        return true;
    }
    /// <summary>
    /// Provides the behavior for the "Arrange" pass of Silverlight layout. Classes can override this method to define their own arrange pass behavior.
    /// </summary>
    /// <param name="finalSize">The final area within the parent that this element should use to arrange itself and its children.</param>
    /// <returns>The actual size used.</returns>
    protected override Size ArrangeOverride(Size finalSize)
    {
        UIElementCollection internalChildren = Children;
        int count = internalChildren.Count;
        int num2 = count - (this.LastChildFill ? 1 : 0);
        double x = 0.0;
        double y = 0.0;
        double num5 = 0.0;
        double num6 = 0.0;
        for (int i = 0; i < count; i++)
        {
            UIElement element = internalChildren[i];
            if (element != null)
            {
                Size desiredSize = element.DesiredSize;
                Rect finalRect = new Rect(x, y, Math.Max((double)0.0, (double)(finalSize.Width - (x + num5))), Math.Max((double)0.0, (double)(finalSize.Height - (y + num6))));
                if (i < num2)
                {
                    switch (GetDock(element))
                    {
                        case Dock.Left:
                            x += desiredSize.Width;
                            finalRect.Width = desiredSize.Width;
                            break;
                        case Dock.Top:
                            y += desiredSize.Height;
                            finalRect.Height = desiredSize.Height;
                            break;
                        case Dock.Right:
                            num5 += desiredSize.Width;
                            finalRect.X = Math.Max((double)0.0, (double)(finalSize.Width - num5));
                            finalRect.Width = desiredSize.Width;
                            break;
                        case Dock.Bottom:
                            num6 += desiredSize.Height;
                            finalRect.Y = Math.Max((double)0.0, (double)(finalSize.Height - num6));
                            finalRect.Height = desiredSize.Height;
                            break;
                    }
                }
                element.Arrange(finalRect);
            }
        }
        return finalSize;
    }
    /// <summary>
    /// Provides the behavior for the "measure" pass of Silverlight layout. Classes can override this method to define their own measure pass behavior.
    /// </summary>
    /// <param name="availableSize">The available size that this element can give to child elements. Infinity can be specified as a value to indicate that the element will size to whatever content is available.</param>
    /// <returns>
    /// The size that this element determines it needs during layout, based on its calculations of child element sizes.
    /// </returns>
    protected override Size MeasureOverride(Size availableSize)
    {
        UIElementCollection internalChildren = Children;
        double num = 0.0;
        double num2 = 0.0;
        double num3 = 0.0;
        double num4 = 0.0;
        int num5 = 0;
        int count = internalChildren.Count;
        while (num5 < count)
        {
            UIElement element = internalChildren[num5];
            if (element != null)
            {
                Size remainingSize = new Size(Math.Max((double)0.0, (double)(availableSize.Width - num3)), Math.Max((double)0.0, (double)(availableSize.Height - num4)));
                element.Measure(remainingSize);
                Size desiredSize = element.DesiredSize;
                switch (GetDock(element))
                {
                    case Dock.Left:
                    case Dock.Right:
                        num2 = Math.Max(num2, num4 + desiredSize.Height);
                        num3 += desiredSize.Width;
                        break;
                    case Dock.Top:
                    case Dock.Bottom:
                        num = Math.Max(num, num3 + desiredSize.Width);
                        num4 += desiredSize.Height;
                        break;
                }
            }
            num5++;
        }
        num = Math.Max(num, num3);
        return new Size(num, Math.Max(num2, num4));
    }
    private static void OnDockChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (!RadDockPanel.IsValidDock(e.NewValue))
        {
            throw new ArgumentException("Invalid Dock value");
        }
        FrameworkElement reference = d as FrameworkElement;
        if (reference != null)
        {
            RadDockPanel parent = reference.Parent as RadDockPanel;
            if (parent != null)
            {
                parent.InvalidateMeasure();
            }
        }
    }
    private static void OnLastChildFillChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        RadDockPanel panel = d as RadDockPanel;
        if (panel != null)
        {
            panel.InvalidateArrange();
        }
    }
}

in which cases should i use RadDockPanel?
Miroslav Nedyalkov
Telerik team
 answered on 06 Sep 2010
1 answer
59 views
When we try to save the data by looping through the data set binded to the control it does not pick up the change shown in the screen shot.  If we tab out or move to another cell or any region other than the one indicated in the screen shot the data can be saved.  It is only not saved when the grey box appears as in screen shot.
Nedyalko Nikolov
Telerik team
 answered on 06 Sep 2010
1 answer
222 views
Increase RadChart performance when updating data?

We are utilizing thousands of data points.  But instead of starting with an empty collection and adding thousands of datapoints (we have the collection populated and bind once, which works fine), we need to update all the datapoints at the same time.

Again, by default, each datapoint update generates a change notification and the RadChart re-analyses the data (which takes long, varying on the number of datapoints)
We're trying to update the information more efficiently, similar to the example of adding points more efficiently (where the messages for the collection changed are being suppressed):

//observable collection implementation
public class CustomObservableCollection<T> : ObservableCollection<T>
{
           
    public void UpdateData()
    {  
            //manually force chart to update
            base.OnCollectionChanged( new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }
           
}
   
   
//data structure, INotifyPropertyChangedis also not implemented in the viewmodel.
//Therefore no change reflects an update; we have control through CustomObservableCollection.UpdateData() to force and update
//For the viewmodel, accessing the PointColor property (which is mapped in the xaml) calculates the value
public class MyData
{
    public double XValue { get; set; }
    public double YValue { get; set; }
      
}
   
   
//multiple series implementation: collection of collection.
private CustomObservableCollection<CustomObservableCollection<MyDataViewModel>> chartData = new CustomObservableCollection<CustomObservableCollection<MyDataViewModel>>();
   
//Data binding once series-mappings have been completed, this takes about a second regardless of the volume of information
public void BindData(CustomObservableCollection<CustomObservableCollection<MyDataViewModel>> pchartData)
{
    chartData = pchartData;
    RadChartMain.ItemsSource = this.chartData;
}
   
//update code
public void UpdateChart()
{
    for (int series = 0; series < chartData.Count; series++)
    {               
        for (int datapoint = 0; datapoint < chartData[series].Count; datapoint++)
        {
            Random rnd = new Random(DateTime.Now.Second + series + datapoint);
            chartData[series][datapoint].MyData.YValue = rnd.Next(0, 100);
        }               
    }
       
    //call once to force the update
    chartData.UpdateData();
       
}



While this functions (update messages are now not sent automatically and we can force the RadChart to refresh once all the points are updated), the update process still takes the same time.  In comparason, the initial binding takes only a second.

Is there something missing in our implementation causing the RadChart to re-analyze the data datapoint by datapoint?

Vladimir Milev
Telerik team
 answered on 06 Sep 2010
5 answers
213 views

Hi

I have a requirement where i need to generate some columns of a grid dynamically at runtime. I have found a solution you have provided as part of another ticket and I updated the code to see if it works for my situation. In my case i need to show checkboxes and allow the user to edit it.
I am attaching the modified source code.

ICollection<EmployeeRecord> employeeRecords;
// Get some mock data
           employeeRecords = GetDummyData();
           GridViewDataColumn tempDataColumn = new GridViewDataColumn();
           //Add the known columns
           tempDataColumn=new GridViewDataColumn() 
           
               UniqueName = "EmployeeName"
               , DataMemberBinding = new Binding("EmployeeName")
           };
           tempDataColumn.IsReadOnly = true;
           this.grid.Columns.Add(tempDataColumn);
           tempDataColumn = new GridViewDataColumn()
           {
               UniqueName = "ID"
               ,
               DataMemberBinding = new Binding("ID")
           };
           tempDataColumn.IsReadOnly = true;
           this.grid.Columns.Add(tempDataColumn);
             
             
           // Now add the dynamic number of columns
             
           // Determines the maximum number of months that any employee has worked.
           int maxNumberOfMonths = employeeRecords.Max((x) => x.RolePermission.Count);
           for (int i = 0; i < maxNumberOfMonths; i++)
           {
               tempDataColumn=new GridViewDataColumn()
               {
                   UniqueName = "Read" + (i + 1)
                   , DataMemberBinding = new Binding("RolePermission[" + i + "]")
                   , DataType = typeof(bool) 
               };
               tempDataColumn.EditorSettings=new CheckBoxEditorSettings();
               tempDataColumn.IsReadOnly = false;
               this.grid.Columns.Add(tempDataColumn);
           }
             
             
           // Finally, bind the grid
           this.grid.ItemsSource = employeeRecords;

 

 

I have to solve following problems

1. I am able to uncheck the check boxes but it is getting reset when I move to next row i need this persisted so that I can save those values to the database.
2. I need to hide checkboxes for some rows under some columns based on a value is it possible directly something i can set while creating the columns.

Thanks & Regards
Kiran

Kiran
Top achievements
Rank 1
 answered on 06 Sep 2010
2 answers
91 views

Hi!

It is possible to have my own class alert inheriting from radWindow.Alert to put into a combobox? can you show me an example?

thanks

ENTERPRISE INTERNATIONAL SAS
Top achievements
Rank 1
 answered on 04 Sep 2010
Narrow your results
Selected tags
Tags
+? more
Top users last month
Rob
Top achievements
Rank 3
Iron
Iron
Iron
Atul
Top achievements
Rank 1
Iron
Iron
Iron
Alexander
Top achievements
Rank 1
Veteran
Iron
Serkan
Top achievements
Rank 1
Iron
Shawn
Top achievements
Rank 1
Iron
Iron
Want to show your ninja superpower to fellow developers?
Top users last month
Rob
Top achievements
Rank 3
Iron
Iron
Iron
Atul
Top achievements
Rank 1
Iron
Iron
Iron
Alexander
Top achievements
Rank 1
Veteran
Iron
Serkan
Top achievements
Rank 1
Iron
Shawn
Top achievements
Rank 1
Iron
Iron
Want to show your ninja superpower to fellow developers?
Want to show your ninja superpower to fellow developers?