I have a UserControl that has a XamNumericEditor as a part of the Tree.
I am trying to set its binding value at runtime and add it dynamically to the children of a control.
This pattern works with TextBox, Button, ComboBox and some other controls. But I can't seem to get it to work with an Infragistic control. Nothing binds to it...but on all the other controls it works.
Please help!
Here is my simplified UserControl XAML
<UserControl x:Class="SilverlightApplication1.XText" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" xmlns:ig="http://schemas.infragistics.com/xaml" d:DesignHeight="300" d:DesignWidth="400"> <Grid x:Name="LayoutRoot" Background="White"> <ig:XamNumericEditor Name="MyNumericEditor"/> </Grid></UserControl>Here is my code behindpublic partial class XText : UserControl { public XText() { InitializeComponent(); MyNumericEditor.SetBinding(XamNumericEditor.ValueProperty, new Binding() { Source = this, Path = new PropertyPath("MyText"), Mode = BindingMode.TwoWay }); } public double MyText { get { return (double)GetValue(MyTextProperty); } set { SetValue(MyTextProperty, value); } } public static readonly DependencyProperty MyTextProperty = DependencyProperty.Register( "MyText", typeof(double), typeof(XText), new PropertyMetadata(null)); }And when I want to use it string s = @"<uc:XText MyText=""{Binding Path=" + path + @", Mode=TwoWay}""/>";
public partial class XText : UserControl { public XText() { InitializeComponent(); MyNumericEditor.SetBinding(XamNumericEditor.ValueProperty, new Binding() { Source = this, Path = new PropertyPath("MyText"), Mode = BindingMode.TwoWay }); } public double MyText { get { return (double)GetValue(MyTextProperty); } set { SetValue(MyTextProperty, value); } } public static readonly DependencyProperty MyTextProperty = DependencyProperty.Register( "MyText", typeof(double), typeof(XText), new PropertyMetadata(null));
string s = @"<uc:XText MyText=""{Binding Path=" + path + @", Mode=TwoWay}""/>";
Anyone????? Ideas??? Please Help
Hello,
I'm not sure what exactly you're trying to do. I don't see any issue with your code.
What's the last line of your code supposed to do? It looks like you didn't paste the full sample. Are you trying to create a UserControl at runtime using XamlReader ?
Regards,
I see that your example works.
Here is a slimmed down version of mine.
The XamNumericEditor does not work, but if you comment out the XamNuemricEditor and uncomment the TextBox in both the markup and codebehind of XText, you will see that it works with the TextBox but not the XamNumericEditor.
The reason why I am wrapping this control, is so I can register events to it. Since I am using XamlReader, I cant register an event inside the Xaml that I am loading. So instead I load a User control that wraps the XamNumericEditor or TextBox and inside the wrapper contains the registered events.
Thanks!
Hi,
It looks that this is caused by some timing issue. I moved the binding on the Loaded event of the control to make sure everything's initialized at that point and it worked fine.
However, this revealed another minor issue - the numbers being displayed were truncated, so I've set a MinWidth value of the NumericEditor in the DataTemplate.
I'm attaching a solution with the changes I've made.
Georgi,
Your example does work better but if you start clicking around on the grid between different cells I still get an unhandled exception "System.InvalidOperationException: operation is not valid due to the current state of the object"
I'm not sure if this is a Grid Problem or a UserControl issue.
System.Windows.Data.BindingExpression.UpdateSource() at Infragistics.Controls.Grids.CellControl.EvaluateEditingBindings() at Infragistics.Controls.Grids.Cell.ExitEditMode(Object newValue, Boolean editingCanceled) at Infragistics.Controls.Grids.XamGrid.ExitEditModeInternal(Boolean cancel) at Infragistics.Controls.Grids.XamGrid.SetActiveCell(CellBase cell, CellAlignment alignment, InvokeAction action, Boolean allowSelection, Boolean setFocus, Boolean scrollIntoView) at Infragistics.Controls.Grids.XamGrid.SetActiveCell(CellBase cell, CellAlignment alignment, InvokeAction action, Boolean allowSelection, Boolean scrollIntoView) at Infragistics.Controls.Grids.XamGrid.SetActiveCell(CellBase cell, CellAlignment alignment, InvokeAction action, Boolean allowSelection) at Infragistics.Controls.Grids.Cell.OnCellMouseDown(MouseEventArgs e) at Infragistics.Controls.Grids.XamGrid.XamWebGrid_MouseLeftButtonDown(Object sender, MouseButtonEventArgs e) at MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args) at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)
I have attached an updated example.
Please Help!
It still seems to be some timing issue. The Loaded event of your custom user control might not be the best place to create this binding. I modified your sample and placed the Binding creation in LayoutUpdated event, and now it's working fine for me.
However, a better approach here would be to make your XText class inherit from Control instead of UserControl and move this logic in OnApplyTemplate.
Hope that helps,
How about this instead of setting the binding in LayoutUpdated I could still do it on Loaded and then when the XText is unloaded do this:
private void XText_Unloaded(object sender, RoutedEventArgs e){
this.MyNumericEditor.ClearValue(XamNumericEditor.ValueProperty);}This seems to work too...