首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与茜素形式FlexLayout.Basis的结合

与茜素形式FlexLayout.Basis的结合
EN

Stack Overflow用户
提问于 2019-03-20 19:44:06
回答 2查看 1.6K关注 0票数 0

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

我的XAML:

代码语言:javascript
复制
 ...
 <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>
 ...

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

代码语言:javascript
复制
...
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等)时确实可以工作(也就是说,它与我的绑定无关)。就像这样:

代码语言:javascript
复制
...
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!
}

...

如有任何指导,将不胜感激。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-20 20:40:43

当通过绑定设置值时,不会调用XAML TypeConverters,因此当您试图绑定字符串"25%“时,不会应用默认FlexBasis TypeConverter

幸运的是,FlexBasisTypeConverter类是公共的,因此您可以在您自己的转换器类中使用它,如下所示:

代码语言:javascript
复制
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();
    }
}
票数 1
EN

Stack Overflow用户

发布于 2019-03-20 20:39:59

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

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

代码语言:javascript
复制
ItemBasis = new FlexBasis(.5f, true);

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55269019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档