2012-04-17 61 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,它隱藏了它的數據上下文的父母,你的組合框不可以訪問佈局層次結構中任何位於網格上方的數據上下文爲了避免這種限制,您可以指定哪個祖先用於數據上下文