您好我有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;
}
答案 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