Datagrid Template列内容仅在选择行和单击单元格时可见

时间:2012-07-19 09:29:01

标签: wpf datagrid wpfdatagrid

您好我有Datagrid绑定到自定义AutoCAD图层对象的ObservableCollection。 3列是DataGridTextColumns并正常工作。但是我还有一个DataGridTemplateColumn,其中包含一个包含标签和Rectangle的StackPanel。我正在使用标签显示图层的ACI或RGB值,具体取决于它的设置方式和显示矩形中的颜色。矩形具有鼠标按下事件,可启动颜色选择器对话框,以便用户可以为图层选择新颜色。此功能有效。不起作用的是单元格的内容(标签和矩形)仅显示在选定的行中并单击单元格,而它们需要始终可见。

我尝试在DataTemplate中使用Grid并使用Grid的FocusManager.Focused元素来提供Rectangle Focus,但这并未改变行为。

<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;
    }

1 个答案:

答案 0 :(得分:1)

使用CellTemplate代替CellEditingTemplate

修复了无法显示的问题

我在此页面上调整了surfen的答案以解决选择问题

How to perform Single click checkbox selection in WPF DataGrid?

用这个替换他的方法:

private static void GridColumnFastEdit(DataGridCell cell,RoutedEventArgs e)         {             if(cell == null || cell.IsEditing || cell.IsReadOnly)                 返回;

        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;
        }

    }

并在样本上添加一个事件以获取它所在的单元格

private void swatch_PreviewMouseLeftButtonDown(object sender,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