Xamarin Forms Xaml Converter: привязываемое свойство - PullRequest
0 голосов
/ 01 октября 2019

В Xamarin Forms я пытаюсь создать конвертер xaml со свойствами. Это должно использоваться, например, для отображения значений из списка по-разному, в зависимости от свойства кода.

Мой код основан на этом: https://stackoverflow.com/a/29869734.

Конвертер:

namespace App2.Converters
{
    class MyConverter : IValueConverter
    {

        public int ConvParam { get; set; }

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return $"value: {value} - ConvParam: {ConvParam}";
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

XAML:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:conv="clr-namespace:App2.Converters"
         x:Class="App2.MainPage"
         x:Name="MainPageXaml">

<ContentPage.Resources>
    <conv:MyConverter x:Key="cnv" ConvParam="{Binding Source={Reference MainPageXaml}, Path=PropParam}" />
    <!--<conv:MyConverter x:Key="cnv" ConvParam="333" />-->
</ContentPage.Resources>

<StackLayout Orientation="Vertical">
    <!-- Place new controls here -->
    <Label Text="{Binding Source={Reference MainPageXaml}, Path=PropVal}" />
    <Label Text="{Binding Source={Reference MainPageXaml}, Path=PropParam}" />
    <Label Text="{Binding Source={Reference MainPageXaml}, Path=PropVal, Converter={StaticResource cnv}}" />
</StackLayout>

Код позади:

public partial class MainPage : ContentPage
{

    public int PropVal { get; set; } = 111;
    public int PropParam { get; set; } = 222;

    public MainPage()
    {
        InitializeComponent();
    }
}

Цель состоит в том, чтобы связать ConvParam моего конвертера с PropParam в коде позади.

Но если я использую:

<conv:MyConverter x:Key="cnv" ConvParam="{Binding Source={Reference MainPageXaml}, Path=PropParam}" />

ошибка Позиция10:39. Не найдено ни свойства, ни привязываемого свойства, ни события для 'ConvParam' или несоответствующего типа между значением и свойством , и приложение не компилируется.

Само свойство ConvParam распознается внутри xaml: если я заменим указанную выше строку на

<conv:MyConverter x:Key="cnv" ConvParam="333" />

, то все будет работать.

Я использовал выражение привязки ( {Binding Source = {Reference MainPageXaml}, Path =PropParam} ) на самом деле работает, если используется в качестве источника для свойства text метки:

<Label Text="{Binding Source={Reference MainPageXaml}, Path=PropParam}" />

Но если я использую его в ресурсах, он не работает.

1 Ответ

0 голосов
/ 01 октября 2019

Благодаря Julipan я мог бы заставить его работать!

Как он указал, ConvParam должен быть BindableProperty, поэтому я изменил свой конвертер для наследования от BindableObject и определил ConvParam как BindableProperty.

Конвертер:

namespace App2.Converters
{
    class MyConverter : BindableObject, IValueConverter
    {
        public static readonly BindableProperty ConvParamProperty = BindableProperty.Create(nameof(ConvParam), typeof(int), typeof(MyConverter));

        public int ConvParam
        {
            get { return (int)GetValue(ConvParamProperty); }
            set { SetValue(ConvParamProperty, value); }
        }

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return $"value: {value} - ConvParam: {ConvParam}";
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...