绑定到Xamarin表单FlexLayout.Basis

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了绑定到Xamarin表单FlexLayout.Basis相关的知识,希望对你有一定的参考价值。

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

我的XAML:

 ...
 <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>
 ...

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

...
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!
}

...

以上不起作用。似乎从未设置基础,因此使用默认值。

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

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

public void SetBasis()
{
    ItemBasis = 250; // or any other absolute value.
    // Works!
}

...

任何指导都将不胜感激。

谢谢!

答案

通过绑定设置值时不调用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();
    }
}
另一答案

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

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

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

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

以上是关于绑定到Xamarin表单FlexLayout.Basis的主要内容,如果未能解决你的问题,请参考以下文章

绑定到Xamarin表单FlexLayout.Basis

将多个类的数据绑定到单个列表视图/xamarin 表单

如何在 Xamarin 表单中将数组绑定到 ListView

在 Xamarin 表单中将 Observable 集合绑定到我的 ListView 时遇到问题

Xamarin 表单绑定 - 访问父属性

在 xamarin 表单上动态绑定图像源