2011-08-30 63 views
2

的目標將是檢查所有網格複選框如果頭複選框改變:CellTemplate中的DataTrigger綁定到HeaderTemplate;它可以工作嗎?這裏

<Window.Resources> 

    <Style TargetType="CheckBox" x:Key="InnerBox"> 
     <Setter Property="HorizontalAlignment" Value="Center" /> 
     <Style.Triggers> 
      <DataTrigger Value="True" 
         Binding="{Binding IsChecked, 
         ElementName=HeaderCheckbox}"> 
       <Setter Property="IsChecked" Value="True" /> 
      </DataTrigger> 
      <DataTrigger Value="False" 
         Binding="{Binding IsChecked, 
         ElementName=HeaderCheckbox}"> 
       <Setter Property="IsChecked" Value="False" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

</Window.Resources> 

<DataGrid> 
    <DataGrid.Columns> 

     <!-- col1 --> 
     <DataGridTemplateColumn> 
      <DataGridTemplateColumn.HeaderTemplate> 
       <DataTemplate> 
        <!-- header check --> 
        <CheckBox Name="HeaderCheckbox" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.HeaderTemplate> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <!-- body check --> 
        <CheckBox Style="{StaticResource InnerBox}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 

     <!-- col2 --> 
     <DataGridTextColumn Binding="{Binding}" Header="Text" /> 
    </DataGrid.Columns> 

    <!-- sample data --> 
    <sys:String>1</sys:String> 
    <sys:String>2</sys:String> 
    <sys:String>3</sys:String> 
</DataGrid> 

的樣子:

Screen

出於某種原因,觸發不火。

任何想法?

回答

4

ElementNameDataTemplate之內的綁定無法到達模板之外的元素,正如您注意到的那樣。這是因爲它可以實例化很多次,並有自己的名稱範圍,因此您在DataTemplate中創建的任何ElementName綁定將在模板內部查找具有該名稱的另一個元素。

看着它與史努比我們也可以看到,一個RelativeSource結合不能直接使用,因爲它們是在Visual樹

enter image description here

,我能想到的唯一的事情的不同部分解決這個問題是將兩個CheckBox綁定到一個共同的祖先,例如父母DataGrid並使用附加屬性或Tag屬性。例如

<Style TargetType="CheckBox" x:Key="InnerBox"> 
    <Setter Property="HorizontalAlignment" Value="Center" /> 
    <Setter Property="IsChecked" Value="False" /> 
    <Style.Triggers> 
     <DataTrigger Value="True" 
        Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, 
             Path=Tag}"> 
      <Setter Property="IsChecked" Value="True" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

<DataTemplate> 
    <!-- header check --> 
    <CheckBox Name="HeaderCheckbox" 
       IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, 
            Path=Tag, 
            Mode=OneWayToSource}"/> 
</DataTemplate> 
+0

Snope = Snoop? –

+0

@ H.B:哇,是的,意思是探聽:)更新,謝謝! –

+0

聰明,如果使用標籤,你可以添加一個附加屬性。 –

0

我不認爲定期數據綁定到HeaderCheckBox是可能的,因爲CheckBox存在爲Template的一部分,它是在VisualTreeDataGridItems

通常的不同分支我讓它相反:當標題CheckBox被檢查時,檢查所有行CheckBoxes。我的主要原因是因爲CheckBox通常在那裏,所以用戶可以選中/取消選中它們,如果它們被綁定到CheckBox選中狀態,那麼用戶不能改變它們。

爲了實現這個目標,我通常會掛接到Header CheckBox的ClickChecked事件。

如果該行CheckBox.IsChecked狀態勢必東西在視圖模型,我會掛鉤事件在我的ViewModel一個Command,並根據頭複選框設置了CheckBox.IsChecked被綁定到true/false數據項狀態(通常傳過來的CommandParameter

如果CheckBox.IsChecked狀態未綁定到任何東西,你可以通過你的DataGrid.Items使用普通的代碼隱藏循環,使用ItemContainerGenerator得到ItemContainer每個項目,找到CheckBox ,然後設置它的檢查狀態。

+0

對不起,你的答案是沒有意義的我。問題是關於CellTemplate中的DataTriggers綁定到HeaderTemplate。我沒有在問題中使用Commands或ViewModel。我想我真的只是想知道這是否可以完成。我意識到使用除觸發器之外的其他東西可以做同樣的事情。對不起,我的問題不是很清楚。 –

+0

@Jerry我相信這是可能的,但它需要一些非常不尋常的解決方法,例如在Visual Tree中搜索Header CheckBox的Converter。我建議你重新評估你正在嘗試完成的任務,然後再往下找那些路徑並檢查替代方案。 – Rachel

+0

我不認爲對HeaderCheckBox的常規DataBinding是可能的,因爲CheckBox存在於模板中,並且它位於VisualTree的不同分支中,而不是DataGridItems – Rachel

相關問題