Как связать объект на стороне XAML в ContentView? - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь создать шаблон для централизации отображения продукта.

У меня получилось x: Name , но я хотел бы сделать это связывание на стороне XAML как для страницы.

Почему это не работает?

MainPage.cs

<?xml version="1.0" encoding="utf-8" ?>
<base:PageBase
    x:Class="MobileApp.Pages.Main.MainPage"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:main="clr-namespace:MobileApp.Pages.Main"
    xmlns:templates="clr-namespace:MobileApp.Pages.Templates"
    x:DataType="main:MainPageViewModel">
    <StackLayout Padding="10">
        <StackLayout>
            <templates:ProductTemplate Product="{Binding SelectedProduct}" />
        </StackLayout>
    </StackLayout>
</base:PageBase>

ProductTemplate.xaml

<?xml version="1.0" encoding="UTF-8" ?>
<ContentView
    x:Class="MobileApp.Pages.Templates.ProductTemplate"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
    <ContentView.Content>
        <StackLayout>
            <Label Text="{Binding Product.Code}" />
            <Label Text="{Binding Product.Name}" />
        </StackLayout>
    </ContentView.Content>
</ContentView>

ProductTemplate.xaml.cs

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class ProductTemplate : ContentView
{
    public static readonly BindableProperty ProductProperty = BindableProperty
        .Create(nameof(Product),
        typeof(Product),
        typeof(ProductTemplate),
        default(Product));

    public Product Product
    {
        get => GetValue(ProductProperty) as Product;
        set => SetValue(ProductProperty, value);
    }

    public ProductTemplate()
    {
        InitializeComponent();
    }
}

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Вы можете установить путь привязки в xaml пользовательского представления.

ProductTemplate.xaml

<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
              x:Name="CustomView"  // set the name of view
             x:Class="App18.ProductTemplate">
    <ContentView.Content>
        <StackLayout VerticalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand">
            <Label Text="{Binding Product.Code,Source={x:Reference CustomView}}" />
            <Label Text="{Binding Product.Name,Source={x:Reference CustomView}}" />
        </StackLayout>
    </ContentView.Content>
</ContentView>

ProductTemplate.xaml.cs

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class ProductTemplate : ContentView, INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public ProductTemplate()
    {
        InitializeComponent();

    }

    public static readonly BindableProperty ProductProperty = BindableProperty
    .Create(nameof(Product),
    typeof(Product),
    typeof(ProductTemplate),
    default(Product),
    propertyChanged: (obj,oldValue,newValue) =>{


        var bindableObj = obj as ProductTemplate;

        bindableObj.Product = newValue as Product;

    });

    Product product;
    public Product Product
    {
        get {

            return product;

        }

        set
        {
            if(product != value)
            {
                product = value;
                NotifyPropertyChanged("Product");
            }
        }
    }
}

на главной странице. xaml

<StackLayout  VerticalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand">

    <local:ProductTemplate WidthRequest="300" HeightRequest="400" BackgroundColor="LightPink" Product="{Binding xxx}"/>

</StackLayout>
0 голосов
/ 16 марта 2020

Я считаю, что вам нужно установить BindingContext в формах Xamarin

Так что я думаю, что это уже даст вам результаты:

this.BindingContext = this;

Но не делайте этого, пожалуйста. Оберните Product в другую модель или установите BindingContext на Product и привяжите к Code и Name напрямую:

this.BindingContext = this.Product;

и связать:

<StackLayout>
        <Label Text="{Binding Code}" />
        <Label Text="{Binding Name}" />
</StackLayout>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...