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

RadComboBox within DataForm did not apply changes after committed

9 Answers 187 Views
ComboBox
This is a migrated thread and some comments may be shown as answers.
Seree
Top achievements
Rank 2
Seree asked on 09 Jun 2010, 05:05 AM
Hi there,

First of all, I would like to thank you to Telerik to create a wonderful ComboBox, it helps me much on my application development career.

Anyway, I have a question regards on using RadComboBox within DataForm.

Here is my case.
- I have a Product Details form created using DataForm of Silverlight Toolkit.
- I have a field ProductCategoryId which is a foreign key linking to ProductCategories table which I would like to let use pick it up from ComboBox, I want to reuse it so I build a Custom Control named "ProductCategoryLookup" and put RadComboBox within it. Here is the XAML for the Custom Control.
<Grid x:Name="LayoutRoot" Background="White" HorizontalAlignment="Stretch" Width="Auto"
        <riaControls:DomainDataSource AutoLoad="True" Height="0" LoadedData="ddsLookup_LoadedData" Name="ddsLookup" QueryName="GetInventoryItemCategoriesByCompanyIdQuery" Width="0"
            <riaControls:DomainDataSource.DomainContext> 
                <my1:MasterContext /> 
            </riaControls:DomainDataSource.DomainContext> 
        </riaControls:DomainDataSource> 
 
        <Controls1:RadComboBox Name="ComboLookup" IsEditable="True" IsTextSearchEnabled="True" TextSearchMode="StartsWith" ItemsSource="{Binding ElementName=ddsLookup, Path=Data}" DisplayMemberPath="Title" SelectedValuePath="InventoryItemCategoryId" HorizontalContentAlignment="Stretch" UseLayoutRounding="True">             
        </Controls1:RadComboBox> 
    </Grid> 

- Here is the code behind after the Custom Control. I just added a Dependency Property to be able to do data binding.
public static readonly DependencyProperty SelectedIdProperty = DependencyProperty.Register( 
            "SelectedId",  
            typeof(int),   
            typeof(InventoryItemCategoryLookup),   
            new PropertyMetadata(SelectedIdChanged)); 
 
        public int SelectedId 
        { 
            get 
            { 
                return (int)this.GetValue(SelectedIdProperty); 
            } 
            set 
            {                 
                this.SetValue(SelectedIdProperty, value); 
            } 
        } 
 
        private static void SelectedIdChanged(object sender, DependencyPropertyChangedEventArgs args) 
        { 
            var me = sender as InventoryItemCategoryLookup; 
 
            me.ComboLookup.SelectedValue = args.NewValue; 
 
            if (me.SelectedValueChanged != null) 
                me.SelectedValueChanged(); 
        } 

- In the DataForm, I put my Custom Control into the data field like this.
<dataFormToolkit:DataField Grid.Row="3" Grid.Column="0" Label="Category" LabelPosition="Auto"
                                    <my:InventoryItemCategoryLookup SelectedId="{Binding Path=CategoryId, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnExceptions=True}" Behaviors:DataSourceBehavior.Enable="True"
                                    </my:InventoryItemCategoryLookup>                                     
                                </dataFormToolkit:DataField> 

- When I run the application, it displays a correct value.

However, I got 2 problems...
  1. When I change the value by selecting another option from the RadComboBox, the DataForm didn't notified that the data was changed. The Commit button will never appear until I changed another data fields.
  2. When I click on the Commit button, all changes were saved except the value of my Custom Control which is RadComboBox.

So, I think there 2 problems are caused by the same reason that custom control did not notify changes to the DomainDataSource.

I also found some thread that got the same problem with me even he place a RadComboBox directly into the DataForm but I cannot find out a solution within the thread.

From my further research, I found someone talking about Behavior, I also found an example from some thread here about DataSourceBehavior but I cannot figure out how can I apply it in my case. Here is the code I found.
using System.Windows; 
using System.Windows.Controls; 
using System.Threading; 
using System.Windows.Threading; 
using System.Collections.ObjectModel; 
 
namespace ComboDataForm 
    public class DataSourceBehavior 
    { 
        public static bool GetEnable(DependencyObject obj) 
        { 
            return (bool)obj.GetValue(EnableProperty); 
        } 
 
        public static void SetEnable(DependencyObject obj, bool value) 
        { 
            obj.SetValue(EnableProperty, value); 
        } 
 
        public static readonly DependencyProperty EnableProperty = 
            DependencyProperty.RegisterAttached("Enable", typeof(bool), typeof(DataSourceBehavior), new PropertyMetadata(OnEnabledPropertyChanged)); 
 
        private static void OnEnabledPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs args) 
        { 
            // This will simulate the delay in the getting of the data source from a service 
             
            DispatcherTimer timer = new DispatcherTimer(); 
            timer.Tick += (a, b) => 
            { 
                // Case #1 
                //var values = new IntVal[]  
                //{  
                //    new IntVal() { ID = 1Text = "one" }, 
                //    new IntVal() { ID = 2Text = "two" }, 
                //    new IntVal() { ID = 5Text = "five" }, 
                //    new IntVal() { ID = 10Text = "ten" } 
                //}; 
                //(d as ItemsControl).ItemsSource = values
 
                // Case #2 
                var values = new IntVal[]  
                {  
                    new IntVal() { ID = 5Text = "five" }, 
                    new IntVal() { ID = 1Text = "one" }, 
                    new IntVal() { ID = 2Text = "two" }, 
                    new IntVal() { ID = 10Text = "ten" } 
                }; 
                var source = new ObservableCollection<IntVal>(); 
                (d as ItemsControl).ItemsSource = source
                foreach (var v in values) 
                { 
                    source.Add(v); 
                } 
 
 
 
                timer.Stop(); 
            }; 
            timer.Interval = new System.TimeSpan(0, 0, 0, 0, 500); 
            timer.Start(); 
        } 
    } 

So I would like to ask here for some hints or suggestion.

Keep up the great works!

Thank you and best regards,
Seree Woradechjamroen

9 Answers, 1 is accepted

Sort by
0
Seree
Top achievements
Rank 2
answered on 10 Jun 2010, 11:55 AM
Hi,

Could you please have a look at it and give me some suggestion ASAP as I am working on a prototype and it need to be done?

Or do I need to submit the ticket? (I am a paid subscription customer)

Thank you and best regards,
Seree W.
0
Valeri Hristov
Telerik team
answered on 10 Jun 2010, 12:34 PM
Hi Seree,

I cannot see where you are updating the source data object - if you are not updating it, the DataForm has no way to determine if it was changed or not. A support ticket with a simple application that can be used to observe the problem would be of great help.

Regards,
Valeri Hristov
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
Seree
Top achievements
Rank 2
answered on 10 Jun 2010, 12:44 PM
Hi Valeri,

Thanks for your quick response.

I am updating the data through the RadComboBox within my Custom Control which reside in the DataForm.
Anyway, after I changed the value in RadComboBox, the DataForm did not received a change notification from my Custom Control.
It is the same as I put a RadComboBox in to the DataForm.

I am finding how can I make my Custom Control or RadComboBox to notify a changed to the DataForm but still cannot figure it out.

Do you have any suggestion?

Thank you and best regards,
Seree W.
0
Seree
Top achievements
Rank 2
answered on 11 Jun 2010, 08:04 AM
Just to update...

If I put the RadComboBox within the DataForm, I can make it works correctly now. So, the problem is not actually came from RadComboBox but my Custom Control itself.

Anyone have a suggestion or guideline how to create a data bound Custom Control? (The problem is that I can't make the the data binding to work correctly)

Best regards,
Seree W.
0
Seree
Top achievements
Rank 2
answered on 13 Jun 2010, 03:44 PM
Just to update.

Finally, I found how to handle this situation, it is not a false of RadComboBox but how I create a Custom Control.

Thanks anyway,
Seree W.
0
Bob
Top achievements
Rank 1
answered on 21 Jun 2010, 04:08 PM
Hello Seree,

Being new to Silverlight development, I have found many issues with using the combo box in the way you described above. I have come across the Telerik controls since many people have found them to solve this problem. Would it be to much to ask if you could share the code with me as to how you came about to fix the problem?

Here is my scenario, I have two tables:

Product:
ProductID
ProductName
ProductGroupID (FK)

and

ProductGroup:
ProductGroupID (PK)
ProductGroupName

I would like to have a grid that shows me all the Products in the database with the Group column a combobox that shows me the ProductGroupName for that Product and not the ProductGroupID. If I want to change it, I would want to select the ProductGroupName from the combobox.

Do you have any suggestions because I have been unable to get this to work with Silverlight 4 and Visual Studio 2010.

Thank you in advance
Bob
0
Almond
Top achievements
Rank 1
answered on 16 Feb 2011, 02:22 AM
Hello Bob,

Were you able to find a solution in your inquiry below. I have the same dilemma :(

Hope you can share your solution.

Thanks and good day once again.
0
Peter
Top achievements
Rank 1
answered on 29 Jan 2014, 11:03 AM
I have the same problem!

I'm using a RadComboBox within a DataFormComboBoxFiled, which is auto-generated.

I'm not doing anything special, but changing the selected value  of the ComboBox just will not enable the Commit button of the DataForm.
0
Yana
Telerik team
answered on 03 Feb 2014, 09:50 AM
Hi Peter,

This is quite an old thread and it seems that the discussed scenario is different than the one you're describing.  If you're using RadDataForm for Silverlight, please post the question in the corresponding forum:
http://www.telerik.com/forums/silverlight/data-form

Thank you for the understanding.

Regards,
Yana
Telerik
TRY TELERIK'S NEWEST PRODUCT - EQATEC APPLICATION ANALYTICS for SILVERLIGHT.
Learn what features your users use (or don't use) in your application. Know your audience. Target it better. Develop wisely.
Sign up for Free application insights >>
Tags
ComboBox
Asked by
Seree
Top achievements
Rank 2
Answers by
Seree
Top achievements
Rank 2
Valeri Hristov
Telerik team
Bob
Top achievements
Rank 1
Almond
Top achievements
Rank 1
Peter
Top achievements
Rank 1
Yana
Telerik team
Share this question
or