c# - programacion - ¿Preentrenamiento/ocultación en la carga con WPF MVVM?



mvvm xamarin (1)

Tengo un control codificado en WPF que puede tener uno de los tres elementos secundarios: dos elementos SimpleChildElements y un ComplexChildElement, digamos, y cambios entre la visualización de los mismos dependiendo de alguna lógica detrás de escena en el modelo que me permite hacer esto. .

<ItemsControl
   ItemsSource="{Binding ChildPanels.Values}" 
   Name="ContentControl1"
   >
   <ItemsControl.ItemTemplate>
     <DataTemplate>
       <ContentControl Content="{Binding}"
          Visibility="{Binding Path=Active, Converter={StaticResource BooleanToVisibilityConverter}}"/>
     </DataTemplate>
   </ItemsControl.ItemTemplate>
</ItemsControl>

Los elementos secundarios son sus propios ViewModels y tengo algunos recursos declarados en sentido ascendente, por lo que hay DataTemplates para ellos. Puedo elaborar más si ayuda, pero el elemento de agarre del problema es este:

Cuando estoy desplazándome a través de los elementos en el control maestro y aparece ComplexChildElement por primera vez, hay un breve parpadeo apenas visible a medida que se decora, es un conjunto de cuadros combinados decorados con DevExpress. Esta configuración significa que no hay parpadeo cuando desplazo un registro con ComplexChildElement y viceversa, y si comienzo la visualización del control maestro con un ComplexChildElement allí, no hay parpadeo cuando aparece de nuevo.

Pero el control maestro está codificado en otra fuente de datos, y no puedo garantizar que haya un ComplexChileElement en el primer registro, que se carga al inicializar por un marco de visualización más grande en el que realmente no quiero echarle raíces en este momento. .

Entonces, ¿cómo puedo garantizar que ComplexChildElement se renderice cuando se carga el formulario, y posiblemente lo oculte inmediatamente después? Ya he intentado alternar ChildPanels. Activar y desactivar dentro de la función detrás de esto:

 <dxmvvm:Interaction.Triggers>
    <dxmvvm:EventToCommand EventName="Loaded" Command="{Binding OnViewLoadedCommand}" />
 </dxmvvm:Interaction.Triggers>

pero eso no los hace rendir.

Esa función, por cierto:

foreach (var childModel in ChildPanels.Values)
  {
    childModel.Active = true;
    RaisePropertyChanged(() => childModel.Active);
  }
ChangeChildModel();

siendo la última llamada a la función la llamada para cambiar la visibilidad del modelo hijo cuando cambia el registro. Si no hago esa última llamada, todos los modelos de vista infantil comienzan a ser visibles.

https://src-bin.com


Answer #1

¿Por qué no establecer la visibilidad en falso desde el principio? Esto no le impide usar el enlace en Activo después.

La vinculación está bien, pero como DataTemplate lo utiliza para modificar la Visibilidad y el control principal para saber si debe controlar al niño. De modo que, dependiendo del pedido de suscripción al evento PropertyChanged , el control principal puede ver o no el control como Visible.

Por cierto, me pregunto si su primer objetivo no fue evitar el parpadeo que puede ocurrir al llamar a Show / Hide en varios controles. No estoy seguro de que la preimpresión sea la solución adecuada para eso.

Dependiendo de la causa raíz del parpadeo, ya hay varias soluciones en SO:





mvvm