Как получить код, стоящий за BindableProperty, с помощью xaml в формах xamarin

Я реализовал привязываемое свойство в коде содержимого. Я хочу получить доступ к этому коду за связываемым свойством в поле зрения, мой код упомянут ниже, пожалуйста, обратитесь,

CustomControlView.xaml

<ContentView.Content>
   <StackLayout>
      <Entry MyText="Text any message..." TextColor="Orange" />
   </StackLayout>
</ContentView.Content>

CustomControlView.xaml.cs

 public partial class CustomControlView : ContentView
 {
    public string MyText
    {
        get { return (string)GetValue(MyTextProperty); }
        set { SetValue(MyTextProperty, value); }
    }

    // Using a DependencyProperty as the backing store for MyText.  This enables animation, styling, binding, etc...
    public static readonly BindableProperty MyTextProperty =
        BindableProperty.CreateAttached("MyText", typeof(string), typeof(CustomControlView), "", defaultBindingMode: BindingMode.TwoWay, propertyChanged: MyTextPropertyChanged);

    private static void MyTextPropertyChanged(BindableObject bindable, object oldValue, object newValue)
    {
        var control = (Entry)bindable;
        control.Text = newValue.ToString();
    }
 }

MainView.xaml (ContentPage)

 xmlns:view="clr-namespace:MyApp.Views"

   <ContextPage.Content>
       <view:CustomControlView />
   </ContentPage.Content>

Я хочу установить свойство MyText в Entry. Пожалуйста, дайте мне любое предложение.


person Yogeshwaran    schedule 08.01.2019    source источник


Ответы (2)


Вам нужно будет указать свое настраиваемое представление в XAML. Например, если ваш CustomerControlView находится в namespace MyApp.Controls, вам нужно будет указать в XAML:

<ContentPage
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    xmlns:local="clr-namespace:MyApp.Controls"
    x:Class="MyApp.MainPage">
...
</ContentPage>

Затем вы вызываете CustomerControlView так:

<local:CustomerControlView 
    MyText="Text any message..." 
    TextColor="Orange" />

В конце концов, ваш XAML будет выглядеть так:

<ContentPage 
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    xmlns:local="clr-namespace:MyApp.Controls"
    x:Class="MyApp.MainPage">
    <ContentPage.Content>
       <StackLayout>
          <local:CustomerControlView 
              MyText="Text any message..." 
              TextColor="Orange" />
       </StackLayout>
    </ContentPage.Content>
</ContentPage>

Просто к сведению, в вашем коде вы вызываете класс CustomerControlView, но в вашем BindableProperty вы ссылаетесь на CustomControlView.

person Tom    schedule 08.01.2019
comment
CustomControlView - это ContentView. В этом CustomControlView есть Entry, я хочу установить свойство MyText в Entry. Этот CustomControlView реализован в MainPage (ContentPage) .xaml. - person Yogeshwaran; 08.01.2019
comment
Итак, вы хотите расширить Entry? - person Tom; 08.01.2019
comment
Да, но не только Entry, я хочу создать свойство Bindable для многих элементов UIElements. - person Yogeshwaran; 08.01.2019
comment
Тогда ответ Хитеша будет работать, но вам придется реализовать это для каждого представления, в которое вы хотите добавить свой собственный BindableProperty. - person Tom; 08.01.2019

Сначала создайте такой настраиваемый элемент управления,

public class MyCustomEntry : Entry
{
    #region Property MyText

    /// <summary>
    /// Bindable Property MyText
    /// </summary>
    public static readonly BindableProperty MyTextProperty = BindableProperty.Create(
      nameof(MyText),
      typeof(string),
      typeof(MyCustomEntry),
      "",
      BindingMode.TwoWay,
      // validate value delegate
      // (sender,value) => true
      null,
      // property changed, delegate
      (sender,oldValue,newValue) => ((MyCustomEntry)sender).OnMyTextChanged(oldValue,newValue),
      // property changing delegate
      // (sender,oldValue,newValue) => {}
      null,
      // coerce value delegate 
      // (sender,value) => value
      null,
      // create default value delegate
      // () => Default(T)
      null
    );


    // <summary>
    // On MyText changed
    // </summary>
    // <param name = "oldValue" > Old Value</param>
    // <param name = "newValue" > New Value</param>
    protected virtual void OnMyTextChanged(object oldValue, object newValue)
    {
        this.Text = newValue != null ? newValue.ToString() : oldValue.ToString();

    }


    /// <summary>
    /// Property MyText
    /// </summary>
    public string MyText
    {
        get
        {
            return (string)GetValue(MyTextProperty);
        }
        set
        {
            SetValue(MyTextProperty, value);
        }
    }
    #endregion


}

Затем используйте его на своей странице контента следующим образом:

<local:MyCustomEntry 
MyText="Text any message..." 
TextColor="Orange" />
person Hitesh Patil    schedule 08.01.2019
comment
Я хочу создать все связываемые свойства в CustomControlView. Используя ссылку CustomControlView, я хочу установить свойство в этом представлении. - person Yogeshwaran; 08.01.2019