¿Cómo puedo pasar una propiedad como parámetro a un Convertidor si la propiedad se encuentra fuera del contexto del ítem de origen de la lista en XAML – Xamarin?
Estoy trabajando en Listview
, uno de los Label
dentro de Cell
utilizando Converter
. Necesito pasar una propiedad como parámetro
de converter
que no forma parte de itemsource
pero que está definida en viewmodel
.
Este es mi código
<label fontsize="10" text="Fondos insuficientes" isvisible="{Binding balance, Converter={StaticResource IsInsufficientBalanceConverter}, Source={x:Reference Name=multiCardPage}, ConverterParameter={x:Reference BindingContext.Subtotal}}"></label>
Recibo esta excepción
Xamarin.Forms.Xaml.XamlParseException: 'Posición 120:52. No se puede encontrar el objeto referenciado por BindingContext.Subtotal'
Lo que quiero hacer:
Tengo un valor Subtotal
(que no forma parte de itemsource). En itemsource, hay una propiedad balance
, si balance
es menor que Subtotal
, quiero mostrar el Label Insufficient Funds
mencionado anteriormente, de lo contrario, este Label
debería estar invisible. Para esto, quiero pasar Subtotal al Converter junto con balance para obtener un valor true
o false
.
¿Cómo puedo hacer que funcione?
Edición 1: Quiero que view
y converter
escuchen los cambios en el valor de subtotal
y actualicen la interfaz de usuario en consecuencia para que el label Insufficient balance
pueda ser visible/invisible según el saldo en listview
. He intentado utilizar multienlaces, pero no admite el caso con una lista/colección. ¿Cómo puedo solucionarlo?
davy.ai
Para pasar una propiedad del viewmodel como un parámetro de conversor para una etiqueta dentro de una celda en un ListView en Xamarin.Forms, puedes usar la extensión de marcado x:Reference para hacer referencia a la vista y al contexto de enlace.
En el enlace de la etiqueta, establece el convertidor en IsInsufficientBalanceConverter y establece la fuente en el nombre de referencia x:Reference de la vista donde se define el convertidor (en este caso, multiCardPage). Luego, establece el parámetro del convertidor en x:Reference BindingContext de la vista donde se define la propiedad Subtotal.
Sin embargo, como mencionaste que quieres que la vista y el convertidor escuchen los cambios en el valor de Subtotal y actualicen la interfaz de usuario en consecuencia, puedes usar una BindableProperty para crear una propiedad personalizada en la vista que escuche los cambios en el valor de Subtotal, y luego enlazar la propiedad IsVisible de la etiqueta a esa propiedad personalizada utilizando un convertidor.
En la vista, crea una BindableProperty para el valor de Subtotal:
Luego, en el método OnSubtotalChanged, puedes recorrer todos los elementos en el origen de datos del ListView, crear la celda para cada elemento, establecer el contexto de enlace de la celda en el elemento, encontrar la etiqueta dentro de la celda por su nombre y actualizar su propiedad IsVisible utilizando el método IsSufficientBalance del convertidor.
Finalmente, en el convertidor, puedes comprobar los valores de balance y Subtotal y devolver un valor booleano para la propiedad IsVisible:
Con este enfoque, la vista y el convertidor escucharán los cambios en el valor de Subtotal y actualizarán la propiedad IsVisible para todas las etiquetas en el ListView en consecuencia.