2010-09-20 9 views
9

tengo una casilla de verificación, y un ItemsControl poblar varios DataGrids la siguiente manera:WPF La unión a ElementName dentro ItemsControl

<Checkbox Content="Birthday Column Visible" x:Name="UI_BirthdayVisibleCB" /> 

<ItemsControl ItemsSource="{Binding Path=ParentsCollection}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
     <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Children}"> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn Header="Birthday" Width="120" Visibility="{Binding IsChecked, ElementName=UI_BirthdayVisibleCB, Converter={StaticResource BoolToVis}}" > 
... 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
</Rest of closing tags> 

Esto crea errores de salida vinculante, ya que trata de encontrar IsChecked en el DataGridTemplateColumn. Si trato de buscar un antepasado relativa recibo la excepción:

Binding.RelativeSource cannot be set while using Binding.ElementName. 

Tengo un modelo de vista, y se adhieren a MVVM su mayoría, pero en este caso me gustaría mucho para mantener las condiciones de visibilidad de las columnas en la capa de la vista . Tenga en cuenta que BoolToVis solo convierte Boolean en Visibilidad.

Editar

Aquí es un ejemplo de lo que estoy tratando de hacer:

<DataGridTemplateColumn Header="Birthday" Visibility="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyView} }, Path=IsChecked, ElementName=UI_BirthdayVisibleCB, Converter={StaticResource BoolToVis}}" /> 

Se compila pero no se ejecuta sin embargo, se produce la excepción anteriormente.

Respuesta

3

Si quieres probar RelativeSource, usted tiene que quitar ElementName de la declaración:

Sin embargo, sólo uno de los tres propiedades, ElementName, Fuente, y RelativeSource, se fijará para cada vinculante, o puede ocurrir un conflicto. Esta propiedad arroja una excepción si existe un conflicto fuente vinculante.

http://msdn.microsoft.com/en-us/library/system.windows.data.binding.elementname.aspx

Su uso de ElementName parece correcta, por lo que voy a seguir a mirar el problema, si lo prefiere que más del RelativeSource.

+0

El problema es que necesito tanto Element name como RelativeSource, ya que mi DataContext se establece en el elemento actual de ItemsControl. – bufferz

+0

Publique el código que usa ElementName y RelativeSource por favor. – McStretch

+0

Ok - Edité mi pregunta para mostrar lo que estoy intentando hacer. – bufferz

11

Está utilizando RelativeSource, que no se puede mezclar con ElementName, pero una vez que tiene el RelativeSource correcto, puede profundizar más usando la ruta.

p. Ej.

Visibility="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyView} }, Path=UI_BirthdayVisibleCB.IsChecked, Converter={StaticResource BoolToVis}}" 

presumiblemente tiene algunas xaml como este:

<UserControl class="MyView" ... >...<CheckBox Name="UI_BirthdayVisibileCB"/> ... 

Lo anterior vinculante debe encontrar a este control de usuario por tipo basado en RelativeSource, entonces se tratará de encontrar una propiedad denominada UI_BirthdayVisibleCB, que ganó' t find porque WPF XAML implementa este elemento nombrado como un campo.

El trabajo más fácil es ir a su código subyacente y exponer una propiedad para él.

public object BirthdayVisibileCB_4_binding { 
    get { return UI_BirthdayVisibileDB; } 
} 

y se unen a ella en su lugar:

Visibility="{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type local:MyView} }, 
Path=BirthdayVisibileCB_4_binding.IsChecked, Converter={StaticResource BoolToVis}}" 

Sí, es un tipo de dolor para hacer esto, pero solamente MVVM WPF partidos hasta ahora ... no es un gran ajuste, es sólo el mejor ajuste que tenemos alrededor.

+1

esta es la mejor solución que encontré para este problema. Una ventaja adicional es que compila tiempo seguro –

+1

¡Gracias por esto! Me he sentido realmente frustrado tratando de resolver un problema similar. Estoy sorprendido de que WPF tenga ese descuido. Desde que publicaste esto, ¿has encontrado alguna otra solución? –

+0

@HenryMerriam no, no he encontrado una mejor manera. También ya no estoy usando WPF día a día :) Buena suerte. – jrwren

Cuestiones relacionadas