2012-02-03 78 views
33

我有以下XAML:的ElementName绑定失败

<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."> 

此绑定失败:MarkerEnabled="{Binding ElementName=DisplayMarkers, Path=IsChecked}"

我想结合我的复选框财产器isChecked名为“DisplayMarkers”当我在VS 2010的调试模式下运行这个,输出窗口显示绑定失败,找不到名为'Checkbox'的元素,有谁能告诉我为什么吗?

我从VS得到的错误是:

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

对于未来的用户,你可以运行到上一个ContextMenu这个问题为好,无疑是出于同样的原因。 – BradleyDotNET 2014-05-28 00:16:42

+1

我通过设置父项的'DataContext'来解决此问题,并将其绑定到该项。 'DataContext =“{Binding ElementName = DisplayMarkers}”' – kjhf 2017-01-26 12:27:31

回答

79

您可能没有您尝试绑定的名称范围,可以尝试用Source={x:Reference DisplayMarkers}替换ElementName构造。

对于潜在的循环依赖错误的解决方法,请参阅:https://stackoverflow.com/a/6858917/546730

+0

没错。谢谢。这解决了我的问题。我不太了解名称范围的问题,为什么我需要这样做。但它现在起作用。 – Hosea146 2012-02-03 01:47:32

+7

@ Hosea146:它的要点是,如果你在XAML中有不在视觉或逻辑树中的元素,你将不能使用像RelativeSource和ElementName这样的特定绑定,我怀疑DataSeries是不是在任何树中(它肯定听起来像是抽象的)。 – 2012-02-03 01:50:02

+0

注意:这只适用于.NET 4.0及更高版本 – 2013-12-04 23:42:36