2012-10-23 49 views
1

因此,在我的DataGrid上,我有下面的Style,設置,綁定ReadOnly和Reordering變量,使用MultiDataTrigger觸發,我知道它的工作原理是因爲它灰色並將值設置爲只讀。唯一的問題是,如果用DataGridTemplateColumn創建的ComboBox沒有設置其IsReadOnly值。我怎樣才能得到這個工作?我不知道如何去尋找模板列應該如何綁定。如何使DataGrid MultiDataTrigger影響代碼隱藏添加DataGridTemplateColumn

數據網格樣式(其被包裹在<DataGrid></DataGrid>標籤)

<DataGrid.Style> 
      <Style TargetType="{x:Type DataGrid}"> 
       <Style.Triggers> 
        <MultiDataTrigger> 
         <MultiDataTrigger.Conditions> 
          <Condition Binding="{Binding ReadOnly}" Value="True"/> 
          <Condition Binding="{Binding Reordering}" Value="False"/> 
         </MultiDataTrigger.Conditions> 
         <MultiDataTrigger.Setters> 
          <Setter Property="IsReadOnly" Value="True" /> 
          <Setter Property="Foreground" Value="Gray" /> 
         </MultiDataTrigger.Setters> 
        </MultiDataTrigger> 
        <MultiDataTrigger> 
         <MultiDataTrigger.Conditions> 
          <Condition Binding="{Binding ReadOnly}" Value="True"/> 
          <Condition Binding="{Binding Reordering}" Value="True"/> 
         </MultiDataTrigger.Conditions> 
         <MultiDataTrigger.Setters> 
          <Setter Property="IsReadOnly" Value="True" /> 
         </MultiDataTrigger.Setters> 
        </MultiDataTrigger> 
        <MultiDataTrigger> 
         <MultiDataTrigger.Conditions> 
          <Condition Binding="{Binding ReadOnly}" Value="False"/> 
         </MultiDataTrigger.Conditions> 
         <MultiDataTrigger.Setters> 
          <Setter Property="IsReadOnly" Value="False" /> 
         </MultiDataTrigger.Setters> 
        </MultiDataTrigger> 
       </Style.Triggers> 
      </Style> 
     </DataGrid.Style> 

代碼,用於創建AA DataGridTemplateColumn

DataTemplate comboDisplayTemplate = new DataTemplate(); 
FrameworkElementFactory comboDisplayElement = new FrameworkElementFactory(typeof(ComboBox)); 
Binding comboDisplayBinding = new Binding(f.ColumnName) { UpdateSourceTrigger = UpdateSourceTrigger.LostFocus }; 
comboDisplayElement.SetBinding(ComboBox.SelectedValueProperty, comboDisplayBinding); 
comboDisplayElement.SetValue(ComboBox.DisplayMemberPathProperty, "Value"); 
comboDisplayElement.SetValue(ComboBox.SelectedValuePathProperty, "Key"); 
Binding comboDisplayListBinding = new Binding(f.ColumnName + "List"); 
comboDisplayElement.SetValue(ComboBox.ItemsSourceProperty, comboDisplayListBinding); 
comboDisplayTemplate.VisualTree = comboDisplayElement; 
templateColumn.CellTemplate = comboDisplayTemplate; 

    DataGridTemplateColumn templateColumn = new DataGridTemplateColumn() { 
     Header = f.ShortDisplay, 
}; 

DataTemplate comboboxTemplate = new DataTemplate(); 
FrameworkElementFactory comboboxElement = new FrameworkElementFactory(typeof(ComboBox)); 
Binding comboboxBinding = new Binding(f.ColumnName) { UpdateSourceTrigger = UpdateSourceTrigger.LostFocus }; 
comboboxElement.SetBinding(ComboBox.SelectedValueProperty, comboboxBinding); 
comboboxElement.SetValue(ComboBox.DisplayMemberPathProperty, "Value"); 
comboboxElement.SetValue(ComboBox.SelectedValuePathProperty, "Key"); 
Binding comboboxListBinding = new Binding(f.ColumnName + "List"); 
comboboxElement.SetValue(ComboBox.ItemsSourceProperty, comboboxListBinding); 
comboboxTemplate.VisualTree = comboboxElement; 
templateColumn.CellEditingTemplate = comboboxTemplate; 

回答

1

IsReadOnly屬性用於控制允許/禁止用戶改變底層控件的文本,但ComboBoxes默認情況下沒有要更改的基礎文本。我必須使用UIElement的IsHitTestVisible屬性,從MSDN - >獲取或設置一個值,該值聲明此元素是否可能作爲其渲染內容的某個部分的命中測試結果返回。

<Setter Property="IsHitTestVisible" Value="False" /> 
相關問題