2012-07-19 64 views
0

嗨我有一個Datagrid,它綁定到自定義AutoCAD圖層對象的ObservableCollection。其中3列是DataGridTextColumns,並且可以正常工作。不過,我也有一個DataGridTemplateColumn,其中包含一個包含標籤和Rectangle的StackPanel。我正在使用標籤來顯示圖層的ACI或RGB值,具體取決於它的設置方式以及在矩形中顯示的顏色。該矩形有一個鼠標向下的事件,它啓動一個顏色選擇器對話框,以便用戶可以爲該圖層選擇一種新的顏色。此功能起作用。不起作用的是,單元格(標籤和矩形)的內容僅顯示在選定的行中,並且單元格單擊,而它們需要始終可見。DatagridTemplate列內容只有在選定行並單擊單元格時纔可見

我曾嘗試在DataTemplate中使用網格,並使用網格的FocusManager.Focused元素給予矩形焦點,但這並未改變行爲。

<t:DataGrid x:Name="layersGrid" ItemsSource="{Binding Layers}" 
    SelectedItem="{Binding SelectedLayer, Mode=TwoWay}" SelectionMode="Single"> 
     <t:DataGridTemplateColumn Visibility="Visible"> 
      <t:DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate> 
        <Grid FocusManager.FocusedElement="{Binding ElementName=swatch}"> 
         <StackPanel Orientation="Horizontal"> 
          <Label Content="{Binding Colour.ColourProperty}"/> 
          <Rectangle Name="swatch" Fill="{Binding Colour, Converter={StaticResource colourConverter}}" 
           MouseLeftButtonDown="swatch_MouseLeftButtonDown"/> 
         </StackPanel> 
        </Grid> 
       </DataTemplate> 
      </t:DataGridTemplateColumn.CellEditingTemplate> 
    </t:DataGridTemplateColumn> 
    </t:DataGrid.Columns> 
</t:DataGrid> 

此外,一旦你改變層的顏色在模型視圖中,還沒有更新的矩形,直到另一行被選中,然後將改變後的一個再次被選擇。

private void swatch_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     Colour col = LaunchColourPickerCode(); 
     ((LayersModel)this.Resources[MODEL]).SelectedLayer.Colour = col; 
    } 

回答

0

與他們不顯示的問題已得到修復使用CellTemplate而不是CellEditingTemplate

我適應這個頁面上surfen的答案來解決選擇問題

How to perform Single click checkbox selection in WPF DataGrid?

更換他的方法與此:

private static void GridColumnFastEdit(D ataGridCell cell,RoutedEventArgs e) if(cell == null || cell.IsEditing || cell.IsReadOnly) return;

 DataGrid dataGrid = FindVisualParent<DataGrid>(cell); 
     if (dataGrid == null) 
      return; 

     if (!cell.IsFocused) 
     { 
      cell.Focus(); 
     } 


     DataGridRow row = FindVisualParent<DataGridRow>(cell); 
     if (row != null && !row.IsSelected) 
     { 
      row.IsSelected = true; 
     } 

    } 

並在樣本添加事件以獲得細胞是在

私人無效swatch_PreviewMouseLeftButtonDown(對象發件人,MouseButtonEventArgs E) {

 DataGridCell cell = null; 

     while (cell == null) 
     { 
      cell = sender as DataGridCell; 
      if (((FrameworkElement)sender).Parent != null) 
       sender = ((FrameworkElement)sender).Parent; 
      else 
       sender = ((FrameworkElement)sender).TemplatedParent; 
     } 


     GridColumnFastEdit(cell, e); 
    } 

同樣由於kmatyaszek

相關問題