2009-09-19 7 views
15

Tengo un datatemplate para un modelo de vista donde un control de elementos está vinculado a un CollectionViewSource (para permitir la ordenación en xaml).Los datos de DesignTime no se muestran en Blend cuando se vinculan a CollectionViewSource

<DataTemplate x:Key="equipmentDataTemplate"> 
    <Viewbox> 
     <Viewbox.Resources> 
      <CollectionViewSource x:Key="viewSource" Source="{Binding Modules}"> 
       <CollectionViewSource.SortDescriptions> 
        <scm:SortDescription PropertyName="ID" Direction="Ascending"/> 
       </CollectionViewSource.SortDescriptions> 
      </CollectionViewSource> 
     </Viewbox.Resources> 
     <ItemsControl ItemsSource="{Binding Source={StaticResource viewSource}}" 
         Height="{DynamicResource equipmentHeight}" 
         ItemTemplate="{StaticResource moduleDataTemplate}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal" /> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
     </ItemsControl> 
    </Viewbox> 
</DataTemplate> 

también tengo la configuración del control de usuario, donde se define todo esto para proporcionar datos designtime

d:DataContext="{x:Static vm:DesignTimeHelper.Equipment}"> 

Ésta es básicamente una propiedad estática que me da una EquipmentViewModel que tiene una lista de ModuleViewModels (Equipo. Módulos). Ahora todo el tiempo que se unen a la CollectionViewSource los datos de tiempo de diseño no aparece en la mezcla 3. Cuando se unen a la colección modelo de vista directamente

<ItemsControl ItemsSource="{Binding Modules}" 

puedo ver los datos de tiempo de diseño. ¿Alguna idea de lo que podría hacer?

+2

Tienen exactamente el mismo problema. Enlazar con una propiedad de la Lista está bien, pero tan pronto como me enlace con una CollectionView vinculada a esa propiedad, desaparecen todos los datos. –

Respuesta

7

allí hecho que (ahora al menos) :)

Esta es la solución que he encontrado. El truco es anular la fuente para el designtime CollectionViewSource. Yo uso la propiedad d:DesignSource utilizar otro recurso estático designtime:

<Window.Resource> 
    <CollectionViewSource x:Key="ViewSource" 
      Source="{Binding ModelProperty}" 
      d:DesignSource="{{x:Static MyProg:DesignTimeData.MyList}"> 
     <!-- Contents --> 
    </CollectionViewSource> 
</Window.Resources> 

<!-- No change to the using class --> 
<ListBox ItemsSource="{Binding Source={StaticResource ViewSource}}"> 

</ListBox> 
0
  1. No estoy seguro de x:Static se supone que funciona en d:DataContext, creo que sólo d: DesignInstance o d:DesignData podía.
  2. ¿Ha probado los datos de tiempo de diseño y está seguro de que están llenos de datos?
  3. Intente especificar la propiedad d:IsDesignTimeCreatable=True en el d:DesignInstance.
  4. Aunque this es específico de Silverlight, estoy seguro de que podría darle alguna pista.

Debe tener un aspecto general de esta manera:

d:DataContext="{d:DesignInstance Type=vm:EquipmentViewModel, IsDesignTimeCreatable=True}"

podría utilizar el mismo modelo de vista tanto tiempo de ejecución y tiempo de diseño, hacer que una propiedad IsInDesignTime en que ViewModelBase y devolver datos adecuadamente.
Ejemplo:

private static bool? _isInDesignMode; 
public static bool IsInDesignModeStatic 
{ 
    get 
    { 
     if (!_isInDesignMode.HasValue) 
     { 
      var prop = DesignerProperties.IsInDesignModeProperty; 
      _isInDesignMode 
       = (bool)DependencyPropertyDescriptor 
       .FromProperty(prop, typeof(FrameworkElement)) 
       .Metadata.DefaultValue; 
     } 

     return _isInDesignMode.Value; 
    } 
} 

Nota: Les animo a utilizar StaticResources (en lugar de DynamicResources) para las plantillas o estilos que no están destinados a cambiar en tiempo de ejecución. Lea this para obtener más información.

0

No estoy seguro si esto sigue siendo relevante ... recientemente ha tenido un problema similar - Todavía estoy en algún lugar de la curva de aprendizaje de WPF , simplemente no bastante seguro de dónde ...

De todos modos, aquí está el escenario: Crearía un objeto de tipo ObservableCollection en algún lugar de mi espacio de nombres local (para mantener las cosas simples), por ejemplo ..

public class NodesCollection : ObservableCollection<Nodes> { }

Luego de Mezcla/Xaml, puedo fácilmente "Crear objeto de origen de datos" (a partir de datos de panel de herramientas) y encontrar NodesCollection se muestra y se puede seleccionar.

A continuación, mezcla creará un recurso local cerca de la parte superior del archivo XAML, similar a:

<local:NodesCollection x:Key="NodesCollectionDataSource" d:IsDataSource="True" />

Con esto, se puede unir fácilmente a la propiedad ItemsSource de un cuadro de lista a la fuente de datos que tenemos Acaba de crear. Por ejemplo, haga clic derecho en su cuadro de lista desde el panel de herramientas "Objetos y escala de tiempo" y seleccione "Datos enlazan elementos fuente a datos ..." En el cuadro de diálogo emergente, verá fácilmente NodesCollectionDataSource disponible y puede usarse.

Sin embargo aquí viene los problemas que tuve para resolver ...

En algunos libros que estoy leyendo en este momento, se habla de la creación de un CollectionViewSource en XAML que se puede utilizar para la clasificación/agrupamiento/filtrando/navegando su fuente de datos subyacente.

Primer problema, no encuentro CollectionViewSource en ningún lado en Blend; entonces la única opción es crear la etiqueta en Xaml manualmente.

Simplemente escriba <CollectionViewSource x:Key="cvsNodes" /> dentro del bloque de Recursos (Xaml) y desde allí, puede modificar propiedades adicionales usando la GUI de Mezcla; por ejemplo, establecer la propiedad de origen subyacente y los descriptores de clasificación y grupo adicionales (que se encuentran en el panel de herramientas Recursos).

Ahora viene la parte en la que queremos vincular la propiedad ItemsSource de ListBox a CollectionViewSource. Sin embargo, no podrá encontrar ese artículo utilizando la GUI de Blend. Por lo tanto, debe escribir el valor de enlace manualmente. Por ejemplo:

<ListBox x:Name=.. ItemsSource="{Binding Source={DynamicResource cvsNodes}}".. />

esto funciona. Pero para que sea aún más fácil, tenemos que volver al elemento original de recursos CollectionViewSource en XAML y añadir un atributo adicional:

<CollectionViewSource x:Key="cvsNodes" Source=... d:IsDataSource="True"

El d:IsDataSource="True" hace el truco de tener GUI Mezcla reconocer que los recursos como disponible para ser utilizado.

Ahora, si volvemos a la propiedad ItemsSource de ListBox desde el panel de herramientas Propiedades, deberíamos poder seleccionar cvsNodes de la lista de orígenes de datos disponibles.

Espero que esto ayude a cualquiera que haya llegado a la misma conclusión que yo, que es que Blend y la tecnología Xaml subyacente no están completamente sincronizadas; y que Blend es, en el mejor de los casos, una herramienta para generar el Xaml, no un reemplazo para aprender el idioma Xaml.

+0

También para ayudar a responder la pregunta original; Sí, esto permite que Blend muestre datos de muestra durante el desarrollo. Todo lo que necesita hacer es rellenar algunos datos de muestra dentro del constructor de su clase ObjectCollection; en mi caso, ese sería el ctor de NodesCollection. – klee

Cuestiones relacionadas