В 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}" />
Но если я использую его в ресурсах, он не работает.