x:Bind a ActualWidth parece no funcionar.
Estoy programando en C# UWP. Tengo un UserControl con el siguiente código de ejemplo:
<usercontrol x:class="Sample.AllocPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="Sample" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" name="Root" mc:ignorable="d">
<relativepanel>
<autosuggestbox width="{Binding Mode=OneWay, Path=ActualWidth, ElementName=Root}" margin="50,0,50,0" relativepanel.alignhorizontalcenterwithpanel="True" relativepanel.alignverticalcenterwithpanel="True"></autosuggestbox>
</relativepanel>
</usercontrol>
Este código funciona. Sin embargo, quiero utilizar el nuevo x:Bind
, así que reemplacé {Binding Mode=OneWay, Path=ActualWidth, ElementName=Root}
con {x:Bind Mode=OneWay, Path=Root.ActualWidth}
. Por alguna razón, ahora la caja de sugerencias automática completa <autosuggestbox>
ha desaparecido de la pantalla, supongo que el ancho que está obteniendo es 0.
¿Por qué ocurre esto y cómo puedo solucionarlo?
davy.ai
Esto ocurre porque
{x:Bind}
funciona de manera diferente a{Binding}
. Con{Binding}
, la vinculación es dinámica y actualiza la interfaz de usuario cada vez que cambia el valor vinculado. Sin embargo, con{x:Bind}
, la vinculación es estática y solo actualiza la interfaz de usuario una vez, cuando se carga el control.En este caso específico, el
ActualWidth
delUserControl
es 0 cuando se carga elAutoSuggestBox
, por lo que elWidth
delAutoSuggestBox
también se establece en 0. Para solucionar esto, puedes agregar un valor predeterminado a la expresión{x:Bind}
utilizando el atributoFallbackValue
. Por ejemplo,{x:Bind Mode=OneWay, Path=Root.ActualWidth, FallbackValue=200}
establece el ancho en 200 si elActualWidth
es 0.Otra opción es utilizar un evento
Loaded
en el código subyacente para actualizar elWidth
delAutoSuggestBox
después de que elUserControl
se haya cargado y suActualWidth
ya no sea 0.