Как получить код позади BindableProperty, используя xaml в формах xamarin - PullRequest
0 голосов
/ 08 января 2019

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

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. Пожалуйста, дайте мне любое предложение.

Ответы [ 2 ]

0 голосов
/ 08 января 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" />
0 голосов
/ 08 января 2019

Вам нужно будет сослаться на свой пользовательский вид в вашем 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...