我在我的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>
...我似乎找不到任何示例,文档似乎也没有提到从视图模型绑定到基属性的任何内容。我最初的尝试是尝试将一个字符串绑定到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!
}
...如有任何指导,将不胜感激。
谢谢!
发布于 2019-03-20 20:40:43
当通过绑定设置值时,不会调用XAML TypeConverters,因此当您试图绑定字符串"25%“时,不会应用默认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();
}
}发布于 2019-03-20 20:39:59
Basis属性的类型是FlexBasis https://github.com/xamarin/Xamarin.Forms/blob/bd31e1e9fc8b2f9ad94cc99e0c7ab058174821f3/Xamarin.Forms.Core/FlexEnums.cs#L58
如果将其绑定到字符串,则不会工作(除非使用转换器)。尝试将绑定属性修改为FlexBasis,并分配如下值:
ItemBasis = new FlexBasis(.5f, true);第一个参数是长度,第二个参数是“相对”标志。将其设置为true意味着您正在使用百分比值。
https://stackoverflow.com/questions/55269019
复制相似问题