locked
XAML / Self binding, bindingcontext RRS feed

  • Question

  • User11854 posted

    Hello,

    I want to bind the text property of a editor element to BindableProperty. Here is what I tried:

    MyForm.xaml

    <?xml version="1.0" encoding="UTF-8"?>
    <ContentPage x:Class="Com.Acme.MyForm"
                            xmlns="http://xamarin.com/schemas/2014/forms"
                            xmlns:local="clr-namespace:Com.Acme;assembly=Com.Acme"
                            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                            >
    
        <ContentPage.Content>
            <Grid>
                <Label Text="1" />
                <Editor BindingContext="{local:MyForm}" Grid.Column="1" Text="{Binding Path=MyProperty}" />
            </Grid>
        </ContentPage.Content>
    </ContentPage>
    

    MyForm.cs

    namespace Com.Acme {
    
    public partial class MyForm : ContentPage {
    
        public static readonly BindableProperty MyPropertyProperty = BindableProperty.Create(
                                                                    "MyProperty",
                                                                    typeof(Object),
                                                                    typeof(MyForm),
                                                                    null,
                                                                    BindingMode.TwoWay,
                                                                    null,
                                                                    null,
                                                                    null,
                                                                    null,
                                                                    null
                                                                );
    
        public MyForm () {
            InitializeComponent ();
        }
    
        public Object MyProperty {
    
            get { return GetValue (MyPropertyProperty); }
            set { SetValue(MyPropertyProperty, value); }
    
        }
    
    }
    

    While the code above is running, I see around 60 block of this exception (all are different but similar) in Application Output panel and application exits in emulator:

    [mono-rt]   at <unknown> <0xffffffff>
    [mono-rt]   at (wrapper managed-to-native) System.Reflection.MonoCMethod.InternalInvoke (System.Reflection.MonoCMethod,object,object[],System.Exception&) <IL 0x0001c, 0xffffffff>
    [mono-rt]   at System.Reflection.MonoCMethod.InternalInvoke (object,object[]) [0x00002] in /Users/builder/data/lanes/2058/58099c53/source/mono/mcs/class/corlib/System.Reflection/MonoMethod.cs:535
    [mono-rt]   at System.Activator.CreateInstance (System.Type,bool) [0x000af] in /Users/builder/data/lanes/2058/58099c53/source/mono/mcs/class/corlib/System/Activator.cs:321
    [mono-rt]   at System.Activator.CreateInstance (System.Type) [0x00000] in /Users/builder/data/lanes/2058/58099c53/source/mono/mcs/class/corlib/System/Activator.cs:214
    [mono-rt]   at Xamarin.Forms.Xaml.CreateValuesVisitor.Visit (Xamarin.Forms.Xaml.ElementNode,Xamarin.Forms.Xaml.INode) <IL 0x00192, 0x00c57>
    [mono-rt]   at Xamarin.Forms.Xaml.ElementNode.Accept (Xamarin.Forms.Xaml.IXamlNodeVisitor,Xamarin.Forms.Xaml.INode) <IL 0x000b8, 0x006b7>
    [mono-rt]   at Xamarin.Forms.Xaml.ElementNode.Accept (Xamarin.Forms.Xaml.IXamlNodeVisitor,Xamarin.Forms.Xaml.INode) <IL 0x00058, 0x0038e>
    [mono-rt]   at Xamarin.Forms.Xaml.ElementNode.Accept (Xamarin.Forms.Xaml.IXamlNodeVisitor,Xamarin.Forms.Xaml.INode) <IL 0x0008f, 0x00576>
    

    Where am I doing something wrong?

    Tuesday, September 15, 2015 5:24 PM

Answers

  • User1004 posted

    you don't have to set the BindingContext, you can achieve the same result by setting the Binding Source property

    ... <Editor Grid.Column="1" Text="{Binding MyProperty, Source={x:Reference xMyForm}}" /> ...

    • Marked as answer by Anonymous Thursday, June 3, 2021 12:00 AM
    Wednesday, September 16, 2015 11:17 AM

All replies

  • User11854 posted

    Well... I solved it. I'm writing the solution here.

    First, I set the name of content page by x:Name directive and removed imported local namespace:

    <?xml version="1.0" encoding="UTF-8"?>
    <ContentPage x:Class="Com.Acme.MyForm"
                 x:Name="xMyForm"
                 xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 >
                 ...
    

    then I changed BindingContext property as below:

    ...
    <Editor BindingContext="{x:Reference Name=xMyForm}" Grid.Column="1" Text="{Binding Path=MyProperty}" />
    ...
    

    now MyProperty value appears in the editor.

    Wednesday, September 16, 2015 9:21 AM
  • User1004 posted

    you don't have to set the BindingContext, you can achieve the same result by setting the Binding Source property

    ... <Editor Grid.Column="1" Text="{Binding MyProperty, Source={x:Reference xMyForm}}" /> ...

    • Marked as answer by Anonymous Thursday, June 3, 2021 12:00 AM
    Wednesday, September 16, 2015 11:17 AM
  • User11854 posted

    Thank you @StephaneDelcroix. This is more elegant for a single property.

    Wednesday, September 16, 2015 1:14 PM
  • User230799 posted

    i am using bindable property for entry but binding is not working please help me out

    Tuesday, April 4, 2017 9:30 AM
  • User230799 posted

    I have attched my code please check it out

    Tuesday, April 4, 2017 9:42 AM
  • User230799 posted

    i am getting exception like "at System.Linq.Enumerable.First[TSource] (System.Collections.Generic.IEnumerable1[T] source, System.Func2[T,TResult] predicate)" advance Thnaku

    Tuesday, April 4, 2017 9:43 AM