2012-02-03 8 views
33

tengo el siguiente XAML:ElementName Encuadernación está fallando

<Grid> 
    <Grid.RowDefinitions> 
     ... 
    </Grid.RowDefinitions> 
    <DataGrid Grid.Row="0" ...> 
     <DataGrid.Columns> 
      ... 
     </DataGrid.Columns> 
    </DataGrid> 

    <DockPanel Grid.Row="2"> 
     <CheckBox x:Name="DisplayMarkers" DockPanel.Dock="Top" Content="Display Data Points?" 
       Margin="8,5,0,5" d:LayoutOverrides="Height" HorizontalAlignment="Left" IsChecked="False" /> 
     <vf:Chart DockPanel.Dock="Top" ScrollingEnabled="False" ZoomingEnabled="True" ToolBarEnabled="True"> 
      <vf:DataSeries AxisYType="Secondary" RenderAs="Line" DataSource="{Binding CdTeRoughnessList}" 
        XValueType="DateTime" 
        MarkerEnabled="{Binding ElementName=DisplayMarkers, Path=IsChecked}" Color="Navy" 
        LegendText="Roughness Std. Dev."> 

Esta unión está fallando:. MarkerEnabled="{Binding ElementName=DisplayMarkers, Path=IsChecked}"

Estoy tratando de obligar a la propiedad IsChecked en mi casilla de verificación llamada 'DisplayMarkers" Cuando ejecutar esto, en modo de depuración en VS 2010, la ventana de salida muestra que el enlace está fallando. No puede encontrar el elemento llamado 'Casilla de verificación'. ¿Alguien podría decirme por qué?

El error que obtengo de VS es :

System.Windows.Data Error: 4 : Cannot find source for binding with reference 

    'ElementName=DisplayMarkers'. BindingExpression:Path=IsChecked; DataItem=null; target element is 'DataSeries' (Name=''); target property is 'MarkerEnabled' (type 'Nullable`1') 
+3

para los futuros usuarios, puede encontrarse con este problema en un ContextMenu también, sin duda, por la misma razón. – BradleyDotNET

+1

Lo resolví configurando 'DataContext' del elemento padre en su lugar y vinculándolo a eso. 'DataContext =" {Binding ElementName = DisplayMarkers} "' – kjhf

Respuesta

79

Es posible que no tenga un namescope donde intente enlazar, puede intentar reemplazar la construcción ElementName con Source={x:Reference DisplayMarkers}.

Para una solución para los posibles errores de dependencia cíclica ver: https://stackoverflow.com/a/6858917/546730

+0

Exactamente a la derecha. Gracias. Eso resolvió mi problema. Realmente no entiendo el problema con un namescope y por qué tengo que hacer esto. Pero funciona por ahora. – Hosea146

+7

@ Hosea146: La esencia de esto es que si tienes elementos en XAML que no están en el árbol visual o lógico no podrás usar ciertos enlaces como 'RelativeSource' y' ElementName', sospecho que 'DataSeries' es tampoco en ningún árbol (parece que es abstracto). –

+0

Nota: Esto solo funciona en .NET 4.0 y superior –

4

supongo que el escritor del gráfico, cuando se deriva de FrameworkElement o lo que sea, no se dieron cuenta de que necesitaban añadir cualquier elemento secundario a la lógica árbol ya sea manualmente o mediante una anulación. No obtienes eso de forma gratuita al derivar.

Romper el árbol lógico rompe la capacidad de los niños para enlazar por ElementName.

If you are the author of the Chart object, you can see this related question and answer.

Cuestiones relacionadas