绑定到Xamarin表单FlexLayout.Basis

时间:2019-03-20 19:44:07

标签: xamarin.forms

我在Xamarin.Forms应用程序中有一个页面,试图将相对大小(25%,50%等)绑定到FlexLayout中某个项目的基础上,但无法使其正常工作成功。

我的XAML:

)

我似乎找不到任何示例,并且文档似乎也没有提及有关从视图模型绑定到Basis属性的任何内容。我最初的尝试是尝试将字符串绑定到FlexLayout.Basis。像这样:

 ...
 <FlexLayout x:Name="Flex"
             BindableLayout.ItemsSource="{Binding Path=SelectedSideBarItem.Items}"
             AlignItems="Start"
             JustifyContent="Start"
             Direction="Row"
             AlignContent="Start"
             Wrap="Wrap">
         <BindableLayout.ItemTemplate>
             <DataTemplate>
                 <Button FlexLayout.Basis="{Binding ItemBasis}"
                         Title="{Binding Name}"/>
             </DataTemplate>
         </BindableLayout.ItemTemplate>
 </FlexLayout>
 ...

以上操作无效。似乎从未设置过基础,因此使用了默认设置。

我应该注意,使用绝对大小(250、500等)时,绑定到基础是可行的有效(即,我的绑定不是问题)。像这样:

...
private string _itemBasis;
public string ItemBasis
{
    get => _itemBasis;
    set
    {
        _itemBasis = value;
        OnPropertyChanged(nameof(ItemBasis));
    }
}
...

public void SetBasis()
{
    ItemBasis = "25%"; // or any other percentage.
    // Does not work!
}

...

任何指导将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:0)

Basis属性的类型为FlexBasis https://github.com/xamarin/Xamarin.Forms/blob/bd31e1e9fc8b2f9ad94cc99e0c7ab058174821f3/Xamarin.Forms.Core/FlexEnums.cs#L58

如果将其绑定到字符串将不起作用(除非使用转换器)。 尝试将可绑定属性修改为FlexBasis并分配如下值:

ItemBasis = new FlexBasis(.5f, true);

第一个参数是长度,第二个参数是“相对”标志。将其设置为true意味着您正在使用百分比值。

答案 1 :(得分:0)

通过绑定设置值时不会调用XAML TypeConverters,因此在尝试绑定字符串“ 25%”时不会应用default FlexBasis TypeConverter

幸运的是,FlexBasisTypeConverter类是公共的,因此您可以像这样在自己的转换器类中使用它:

public class StringToFlexBasisConverter: IValueConverter
{
    private readonly FlexBasis.FlexBasisTypeConverter _converter = new FlexBasis.FlexBasisTypeConverter();
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is string stringValue)
        {
            return _converter.ConvertFromInvariantString(stringValue);
        }
        return new FlexBasis();
    }

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