我在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!
}
...
任何指导将不胜感激。
谢谢!
答案 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();
}
}