Problemas de enlace en DataTrigger

En el artículo de Josh Smith,"Aplicaciones WPF con el patrón de diseño Model-View-ViewModel"

En el código de AllCustomersView.xaml:

  <DataTrigger Binding="{Binding Path=Name}" Value="True">
      <Setter TargetName="txt" Property="Text" Value="Company" />
  </DataTrigger>

No pude averiguar dónde está la propiedad. Nombre. Pensé que estaba en CustomerViewModel.cs. Pero de hecho no lo fue. ¿Cómo podría saber el camino de Name?

preguntado el 10 de mayo de 11 a las 12:05

3 Respuestas

Viene de CollectionViewSource:

<CollectionViewSource
  x:Key="CustomerGroups" 
  Source="{Binding Path=AllCustomers}">
  <CollectionViewSource.GroupDescriptions>
    <PropertyGroupDescription PropertyName="IsCompany" />
  </CollectionViewSource.GroupDescriptions>
  <CollectionViewSource.SortDescriptions>
    <scm:SortDescription PropertyName="IsCompany" Direction="Descending" />
    <scm:SortDescription PropertyName="DisplayName" Direction="Ascending" />
  </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

Cuando usa un CVS, toma sus datos (en este caso, una colección de instancias de CustomerViewModel) y los divide en grupos (en este caso, según la propiedad IsCompany).

Cada grupo se coloca en un CollectionViewGroup. Luego, una colección de estos grupos se vincula al control que mostrará los grupos. Entonces, la propiedad Name se encuentra realmente en CollectionViewGroup, y es el valor de IsCompany (que es PropertyGroupDescription), o el valor de cadena de un booleano.

Si cambia el enlace a algo no válido

<DataTrigger Binding="{Binding Path=Derp}" Value="True">
    <Setter TargetName="txt" Property="Text" Value="Companies" />
</DataTrigger>

verá que deja de funcionar y el siguiente mensaje aparece en su ventana de salida:

Error de System.Windows.Data: 39: Error de ruta de BindingExpression: la propiedad 'Derp' no se encuentra en el 'objeto' ''ColecciónViewGroupInternal'(HashCode = 41413147)'. BindingExpression: Path = Derp; DataItem = 'ColecciónViewGroupInternal'(HashCode = 41413147); el elemento de destino es 'ContentPresenter' (Nombre = ''); la propiedad de destino es 'NoTarget' (tipo 'Objeto')

ColecciónViewGroupInternal es la implementación interna de CollectionViewGroup que CollectionViewSource utiliza para agrupar su colección en la propiedad IsCompany

contestado el 10 de mayo de 11 a las 17:05

En setter hay un TargetName = "txt" que es el nombre de

      <TextBlock 
        x:Name="txt" 
        Background="{StaticResource Brush_HeaderBackground}"
        FontWeight="Bold"
        Foreground="White"
        Margin="1"
        Padding="4,2,0,2"
        Text="People" 
        />

Entonces, esta ruta de enlace se establece en este nombre de propiedad de control

contestado el 10 de mayo de 11 a las 17:05

<DataTrigger Binding="{Binding Path=Name}" Value="True">
  <Setter TargetName="txt" Property="Text" Value="Company" />
</DataTrigger>

porque su DataTrigger es parte de un estilo de grupo y su estilo de grupo se usa para su vista de lista y su contexto de datos de vista de lista es una fuente de vista de colección con una descripción de grupo -> la Ruta de enlace = Nombre apunta a las propiedades de MS.Internal.Data.CollectionViewGroupInternal

para que pueda acceder a todas las propiedades desde CollectionViewGroup

por cierto puedes usar Fisgón para obtener más información sobre su aplicación wpf :)

contestado el 10 de mayo de 11 a las 17:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.