Emixam23
Emixam23

Reputation: 3964

Xamarin Forms XAML - Boolean attribute set from XAML

I don't understand something about how to set object attribute for xaml about boolean..

I have a MainPage.xaml like this where I set ProportionalSize to true:

<ContentPage.Resources>
  <ResourceDictionary>
    <converter:BooleanConverter x:Key="Boolean"/>
  </ResourceDictionary>
</ContentPage.Resources>

<ContentPage.Content>
  <!-- Background during loading of start -->
  <AbsoluteLayout>
    <local:CustomImage Source="{extension:ImageResource HomeBG.png}"
                     ProportionalWidth="100" ProportionalHeight="100" ProportionalSize="{True, Converter={StaticResource Boolean}}"
                     AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 1"
                     AbsoluteLayout.LayoutFlags="All"/>
  </AbsoluteLayout>
</ContentPage.Content>  

I use a customImage for some reason, this is the class

public class CustomImage : Image
{
    private bool _ProportionalSize;
    public bool ProportionalSize
    {
        get { return this._ProportionalSize; }
        set
        {
            this._ProportionalSize = value;
            TrySize();
        }
    }
}

Because neither true nor True works, I made a BooleanConverter

public class BooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (bool)value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (bool)value;
    }
}

However, it still doesn't work...


Additional information: Position 19:75. MarkupExtension not found for true ProportionalSize="{True, Converter={StaticResource Boolean}}"


Does I'm doing something wrong?

Upvotes: 0

Views: 2371

Answers (3)

Clint StLaurent
Clint StLaurent

Reputation: 1268

If you're not actually binding to a value that will change... Don't use a converter or property. It looks like you just want to set true one time in XAML. You can use the x:Arguments attribute for that.

<x:Arguments>
    <x:Boolean>True</x:Boolean>
</x:Arguments>

Bigger example from a DataTrigger.

Usecase - The grid has a different value binded to IsVisible, but we want to override that if the administrator is logged in. So in addition to the regular binding, we can put in a datatrigger that uses the x:Arguments of x:Boolean to set it to true. - Without a converter... without a property.

<Grid.Triggers>
    <DataTrigger Binding="{Binding IsAdmin}"
        TargetType="{x:Type Grid}"
        Value="True">
        <Setter Property="IsVisible">
            <Setter.Value>
                <x:Arguments>
                    <x:Boolean>True</x:Boolean>
                </x:Arguments>
            </Setter.Value>
        </Setter>
    </DataTrigger>
</Grid.Triggers>

Upvotes: 1

Yehor Hromadskyi
Yehor Hromadskyi

Reputation: 3388

Try to use BindableProperty:

    public static readonly BindableProperty ProportionalSizeProperty =
            BindableProperty.Create(nameof(ProportionalSize),
                                    typeof(bool),
                                    typeof(CustomImage),
                                    default(bool),
                                    propertyChanged: OnProportionalSizeChanged);

    public bool ProportionalSize
    {
        get { return (bool)GetValue(ProportionalSizeProperty); }
        set { SetValue(ProportionalSizeProperty, value); }
    }

    private static void OnProportionalSizeChanged(BindableObject bindable, object oldValue, object newValue)
    {
        var customImage = bindable as CustomImage;
        if (customImage != null)
        {
            customImage.TrySize();
        }
    }

Upvotes: 0

Keith Rome
Keith Rome

Reputation: 3228

Just set the value, you don't need to use markup extension syntax (those "{}" brackets) or a converter:

ProportionalSize="True"

Upvotes: 1

Related Questions