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

選択問題を解決するために、このページのサーフェンの回答を適応させました

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

    }

スウォッチにイベントを追加して、それが入っているセルを取得します

private void 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に感謝します

于 2012-07-19T10:00:21.630 に答える