我有下一个转换器代码,类似于Xamarin.Forms Binding Converter后的示例,但当值进入方法时,只有属性Path=“DeviceHasScanner”,而绑定属性从未被调用:(
public class BoolToObjectConverter<T> : IValueConverter
{
public T TrueObject { set; get; }
public T FalseObject { set; get; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (bool)value ? TrueObject : FalseObject;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((T)value).Equals(TrueObject);
}
}
我试着用这样的方式来实现它:
<Image HorizontalOptions="Center" WidthRequest="200">
<Image.Source>
<Binding Source="{Binding DeviceHasScanner}">
<Binding.Converter>
<converters:BoolToObjectConverter x:TypeArguments="x:String" TrueObject="presstoscan.png" FalseObject="scanwithcamera.png" />
</Binding.Converter>
</Binding>
</Image.Source>
</Image>
而viewmodel中的布尔绑定属性是:
public bool DeviceHasScanner
{
get
{
return Settings.Get.DeviceHasScanner; //This code return true or false
}
}
实施它的正确方法是什么?
1条答案
按热度按时间gywdnpxw1#
这不是你应该为tbh使用转换器的事情,你应该做的是通过布尔值分配你的ImageSource,或者在你的VM中直接处理它。转换器通常用在你有值转换的场景中。
但是如果你仍然坚持使用这种方法,那么你需要做一些基本的改变,首先你误解了本源在这里的意思,
字符串
上面代码中的Source并不表示您需要提供的属性,而是您要执行查找的上下文,这就是为什么当您看到对象时,它只是复制粘贴您在此处绑定的名称,现在,只有当您的Converter需要在特定上下文中查找时,才需要Source。我很确定这里不是这种情况,所以您所需要做的就是将绑定的值给予Path属性。
所以
<Binding Source="{Binding DeviceHasScanner}">
会变成现在,如果您的源代码在同一绑定上下文中,则无需执行任何操作,但如果不在同一绑定上下文中,则需要提供BindingContext的引用,如示例所示,您可以在www.example.com上找到https://learn.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/data-binding/converters#binding-converter-properties
祝你好运!