XAML 如何使用转换器BoolToObjectConverter为Label添加绑定属性

zynd9foi  于 2022-12-16  发布在  其他
关注(0)|答案(1)|浏览(151)

我有下一个转换器代码,类似于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
        }
    }

实施它的正确方法是什么?

gywdnpxw

gywdnpxw1#

这不是你应该为tbh使用转换器的事情,你应该做的是通过布尔值分配你的ImageSource,或者在你的VM中直接处理它。转换器通常用在你有值转换的场景中。
但是如果你仍然坚持使用这种方法,那么你需要做一些基本的改变,首先你误解了本源在这里的意思,

<Binding Source="{Binding DeviceHasScanner}">

字符串
上面代码中的Source并不表示您需要提供的属性,而是您要执行查找的上下文,这就是为什么当您看到对象时,它只是复制粘贴您在此处绑定的名称,现在,只有当您的Converter需要在特定上下文中查找时,才需要Source。我很确定这里不是这种情况,所以您所需要做的就是将绑定的值给予Path属性。
所以<Binding Source="{Binding DeviceHasScanner}">会变成

<Binding Path="DeviceHasScanner"/>

现在,如果您的源代码在同一绑定上下文中,则无需执行任何操作,但如果不在同一绑定上下文中,则需要提供BindingContext的引用,如示例所示,您可以在www.example.com上找到https://learn.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/data-binding/converters#binding-converter-properties
祝你好运!

相关问题