2012-04-17 63 views
3

组合框结合下面如果我指定的祖先工程工作,但否则不是。如果我不指定祖先,为什么它不起作用?绑定不不指定祖先

<wpftoolkit:DataGrid Grid.Row="4" Grid.Column="1" Grid.ColumnSpan="2" 
         Margin="5" 
         BorderBrush="#A6A6A6" 
         BorderThickness="1" 
         ItemsSource="{Binding DebitListing}" 
         AutoGenerateColumns="False" 
         SelectionMode="Single"> 
     <wpftoolkit:DataGrid.Columns> 
      <wpftoolkit:DataGridComboBoxColumn 
       Header="{Resx ResxName=MyBooks.Properties.Strings, Key=PartyListing_Party_Label}" 
       SelectedItemBinding="{Binding Party, ValidatesOnDataErrors=True}" 
       DisplayMemberPath="Name"> 

       <wpftoolkit:DataGridComboBoxColumn.ElementStyle> 
        <Style TargetType="{x:Type ComboBox}"> 
         <Setter Property="ItemsSource" Value="{Binding Path=DataContext.CreditedAccounts, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" /> 
        </Style> 
       </wpftoolkit:DataGridComboBoxColumn.ElementStyle> 
       <wpftoolkit:DataGridComboBoxColumn.EditingElementStyle> 
        <Style TargetType="{x:Type ComboBox}"> 
         <Setter Property="ItemsSource" Value="{Binding Path=DataContext.CreditedAccounts, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" /> 
        </Style> 
       </wpftoolkit:DataGridComboBoxColumn.EditingElementStyle> 

      </wpftoolkit:DataGridComboBoxColumn> 

      <wpftoolkit:DataGridTextColumn 
       Header="{Resx ResxName=MyBooks.Properties.Strings, Key=PartyListing_Amount_Label}" 
       Binding="{Binding Amount, ValidatesOnDataErrors=True}"/> 
     </wpftoolkit:DataGrid.Columns> 
    </wpftoolkit:DataGrid> 
+0

任何人都有疑问关于问题然后评论。 – pratikjgandhi 2012-04-17 13:44:20

+0

你需要更清楚地解释你的问题是什么。你有一个组合框和“它工作正常,如果祖先写道,否则它不工作”我不知道这意味着什么。 – mydogisbox 2012-04-17 13:45:32

+0

也许给出一个2-3行的例子,说明什么行不通。 – mydogisbox 2012-04-17 13:46:23

回答

1

您需要引用从中获取的祖先的原因你想要的DataContext是因为wpftoolkit在其渲染的子元素上改变了datacontext,你会发现几乎所有的Li都是如此stView/DataGrid控件 - 将子元素DataContext更改为引用当前行或列所代表的集合项。如果你想在这些子元素的模板或样式的东西是基于关闭控制的DataContext的属性,你需要使用RelativeSource Ancestor得到它。

据我所知,这是令人困惑的,因为在基本的XAML中,子元素总是自动继承父元素的数据上下文,但DataContext就像任何其他DependencyProperty一样,并且复杂的控件可以按照他们认为合适的方式进行不同的设置。

,如果你通过给你的父母控制(或其他元素的DataContext设置上)的名称,像x:Name='ControlRoot'愿意,你可以简化你的语法。那么当你需要回到你的根datacontext时,你只需要去:

Value="{Binding ElementName=ControlRoot, Path=DataContext.CreditedAccounts}" 
0

的原因,你的绑定必须指定其祖先是,每次你指定一个数据上下文(或在这种情况下,您DataGridItemsSource,它隐藏了它的数据上下文的父母,你的组合框不可以访问布局层次结构中任何位于网格上方的数据上下文为了避免这种限制,您可以指定哪个祖先用于数据上下文