This is a migrated thread and some comments may be shown as answers.

IDataErrorInfo support and ValidatesOnDataErrors

5 Answers 511 Views
GridView
This is a migrated thread and some comments may be shown as answers.
Yossi Naar
Top achievements
Rank 1
Yossi Naar asked on 21 Feb 2010, 03:08 PM
Hi,
I've been trying to use IDataErrorInfo with the RagGridView, and i ran into some problems.
First of all i haven't been able to find any documentation on RadGridView support for IDataErrorInfo.
there was a single post on the forum that mentioned working with it - and it does work to a certain extent.

What im doing is this: i implemented IDataErrorInfo on in my data model, and i am binding to the grid with ValidatesOnDataErrors="True"
The binding code is:
<controls:RadGridView Name="keywordGrid"  ShowGroupPanel="False" AutoGenerateColumns="False" Height="300" 
                      > 
    <controls:RadGridView.Columns> 
        <controls:GridViewDataColumn Header="Name" DataMemberBinding="{Binding DeferredEntity.Data.Name,  ValidatesOnDataErrors=True}"/> 
        <controls:GridViewDataColumn Header="Destination Url" DataMemberBinding="{Binding DeferredEntity.Data.DestinationUrl, ValidatesOnDataErrors=True}"/> 
        <controls:GridViewDataColumn Header="Tracking Url" DataMemberBinding="{Binding DeferredEntity.Data.TrackingUrl, ValidatesOnDataErrors=True}"/> 
        <controls:GridViewDataColumn Header="Match Type" DataMemberBinding="{Binding DeferredEntity.Data.MatchType, ValidatesOnDataErrors=True}"/> 
        <controls:GridViewDataColumn Header="Status" DataMemberBinding="{Binding DeferredEntity.Data.Status, ValidatesOnDataErrors=True}"/> 
        <controls:GridViewDataColumn Header="Search Bid" DataMemberBinding="{Binding DeferredEntity.Data.SearchBid, ValidatesOnDataErrors=True}"/> 
         
    </controls:RadGridView.Columns> 
     
</controls:RadGridView> 

When scrolling down on the grid everything works as it should - a red border around the invalid data elements shows that there's an error there and the error appears around the correct elements and does not appear around valid elements.

The problem starts when i scroll UP in the grid. as soon as i scroll up everything starts failing - error markers start appearing around all elements regardless of their validity. after scrolling 20-30 records up it doesnt matter what i do - scroll up or down, everything seems to have an error and the boarders start drawing in the wrong place, sometimes over the text of the cells in the grid.

is this the right way to use IDataErrorInfo with Telerik's RadDataGrid?
Is there some other way (but still using IDataErrorInfo binding)?
What is causing this strange behavior?
Also - how do i get the grid to show a tooltip when hovering over an element with an error (with the string that returned from IDataErrorInfo as the error message).

Thanks,
Yossi.



EDIT:

After the above post i thought i'd try a simple test project outside of the rest of our app.
What i found was this - If we bind directly to a property of a class - validation is not called.
If we bind indirectly (through a nested element) - validation is called, but the strange "up/down" behavior i mentioned above occurs.
I am attaching my test project.
Scroll up and down on the "Nested" grid to see the errors i mentioned, the "Direct" grid demonstrates that the validation code is never called.

Hmm...looks like i can't attach the project - so here is the source:
Window1.xaml:

<Window x:Class="GridIDataErrorInfoTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
         xmlns:Telerik="http://schemas.telerik.com/2008/xaml/presentation" 
    xmlns:controls="clr-namespace:Telerik.Windows.Controls;assembly=Telerik.Windows.Controls.GridView" 
    xmlns:grid="clr-namespace:Telerik.Windows.Controls.GridView;assembly=Telerik.Windows.Controls.GridView" 
    xmlns:gridView="clr-namespace:Telerik.Windows.Controls.GridView;assembly=Telerik.Windows.Controls.GridView" 
    Title="Window1" Height="800" Width="600"
    <Grid> 
         
        <Grid.RowDefinitions> 
            <RowDefinition Height="300"/> 
            <RowDefinition Height="300"/> 
        </Grid.RowDefinitions> 
         
        <controls:RadGridView Grid.Row="0" Name="directGrid"  ShowGroupPanel="False" AutoGenerateColumns="False" Height="300"  
                      > 
            <controls:RadGridView.Columns> 
                <controls:GridViewDataColumn Header="Name - DirectBinding" DataMemberBinding="{Binding Name,  ValidatesOnDataErrors=True}"/> 
                <controls:GridViewDataColumn Header="Binding Type - DirectBinding" DataMemberBinding="{Binding BindingType, ValidatesOnDataErrors=True}"/> 
            </controls:RadGridView.Columns> 
 
        </controls:RadGridView> 
        <controls:RadGridView Grid.Row="1" Name="nestedGrid"  ShowGroupPanel="False" AutoGenerateColumns="False" Height="300"  
                      > 
            <controls:RadGridView.Columns> 
                <controls:GridViewDataColumn Header="Name - NestedBinding" DataMemberBinding="{Binding Test.Name,  ValidatesOnDataErrors=True}"/> 
                <controls:GridViewDataColumn Header="Binding Type - NestedBinding" DataMemberBinding="{Binding Test.BindingType, ValidatesOnDataErrors=True}"/> 
            </controls:RadGridView.Columns> 
 
        </controls:RadGridView> 
    </Grid> 
</Window> 
 


Window1.cs.xaml Code:
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.ComponentModel; 
using System.Diagnostics; 
 
namespace GridIDataErrorInfoTest 
    public class DeeperBinding  
    { 
        private TestData test; 
 
        public TestData Test 
        { 
            get { return test; } 
            set { test = value; } 
        } 
         
    } 
    public class TestData : IDataErrorInfo,INotifyPropertyChanged 
    { 
        private String name; 
 
        public String Name 
        { 
            get { return name; } 
            set { 
                name = value; 
                if (this.PropertyChanged != null
                    this.PropertyChanged(thisnew PropertyChangedEventArgs("Name")); 
            } 
        } 
        private String bindingType; 
 
        public String BindingType 
        { 
            get { return bindingType; } 
            set { 
                bindingType = value; 
                if (this.PropertyChanged != null
                    this.PropertyChanged(thisnew PropertyChangedEventArgs("BindingType")); 
            } 
        } 
        #region IDataErrorInfo Members 
 
        public string Error 
        { 
            get { 
                return null
            } 
        } 
 
        public string this[string columnName] 
        { 
            get  
            { 
                Debug.WriteLine("Calling validation - BindingType = "+this.bindingType); 
 
                if (!columnName.Equals("Name")) 
                    return null
 
                if (this.name.Equals("MyErrorValue")) 
                    return "Error !!! WAAHAHAHAHA"
                else 
                    return null
             
            } 
        } 
        #endregion 
        #region INotifyPropertyChanged Members 
 
        public event PropertyChangedEventHandler PropertyChanged; 
        #endregion 
    } 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
        public Window1() 
        { 
             
            InitializeComponent(); 
            //direct binding ignores validation 
            this.directGrid.ItemsSource = GenerateTestData("Direct"); 
            //binding to a nested element calls validation on the nested elements, but does not work properly. 
            this.nestedGrid.ItemsSource = WrapInDeeperBinding(GenerateTestData("Nested")); 
        } 
        private List<TestData> GenerateTestData(String bindingType) 
        { 
            int count = 10000; 
            List<TestData> result = new List<TestData>(); 
            for (int i = 0; i < count; i++) 
                if (i % 2 == 0) 
                    result.Add(new TestData() { Name = "grgrbgrb", BindingType = bindingType}); 
                else 
                    result.Add(new TestData() { Name = "MyErrorValue", BindingType = bindingType }); 
 
            return result; 
        } 
 
 
        private List<DeeperBinding> WrapInDeeperBinding(List<TestData> dataList) 
        { 
            List<DeeperBinding> result = new List<DeeperBinding>(); 
            foreach(var data in dataList) 
                result.Add(new DeeperBinding(){Test = data}); 
            return result; 
        } 
    } 
 

5 Answers, 1 is accepted

Sort by
0
Accepted
Nedyalko Nikolov
Telerik team
answered on 23 Feb 2010, 02:44 PM
Hello Yossi Naar,

I've managed to simulate the reported issue. Thank you for pointing this out. I've updated your Telerik points accordingly. This issue is already fixed and will be available with the next latest internal build (every Friday night).

Sorry for the inconvenience caused.

Greetings,
Nedyalko Nikolov
the Telerik team

Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items.
0
Yossi Naar
Top achievements
Rank 1
answered on 23 Feb 2010, 02:49 PM
Hi Nedyalko Nikolov,
 
Thanks for the response - i was wondering - which issue has been fixed? the bug in the scrolling? the problem with surface vs. nested binding? both?

also - do i have access to these internal builds you mentioned?

Thanks again.
Yossi.


0
Nedyalko Nikolov
Telerik team
answered on 24 Feb 2010, 07:14 AM
Hi Yossi Naar,

Both problems result in a same bug, so both issues are fixed. Internal builds will be available on Friday (26-th Feb). If this is a show stopper for you I'll do my best to send you a private internal build a little bit earlier. Just let me know.

Greetings,
Nedyalko Nikolov
the Telerik team

Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items.
0
Yossi Naar
Top achievements
Rank 1
answered on 24 Feb 2010, 10:52 AM
Hi Nedyalko Nikolov,

As long as i can count on a fix, we can wait for this week's release.
Thanks for the offer though :). 

Yossi.

0
Kowsy
Top achievements
Rank 1
answered on 27 Feb 2012, 10:43 PM
Hi Telerik Team,

I am experiencing the same issue with SIlverlight Radgridview. I am using Silverlight Q3 2011 controls. I am using DataAnnotations and IDataErrorInfo. Everything works fine on the first load of the grid. When i Start Scrolling Up/Down/Right/Left, it messes up and the validation error tooltip appears in valid entries as well. Please let me know a resolution for this asap. Your input will be greatly appreciated.

Thanks!
Kowsy
Tags
GridView
Asked by
Yossi Naar
Top achievements
Rank 1
Answers by
Nedyalko Nikolov
Telerik team
Yossi Naar
Top achievements
Rank 1
Kowsy
Top achievements
Rank 1
Share this question
or