0

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

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

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

1 回答 1

1

他们不显示的问题已通过使用CellTemplate而不是CellEditingTemplate

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

如何在 WPF DataGrid 中执行单击复选框选择?

用这个替换他的方法:

private static void GridColumnFastEdit(DataGridCell 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;
        }

    }

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

私人无效样本_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

于 2012-07-19T10:00:21.630 回答