【解決方法】セルにカーソルを置くと行と列が強調表示されます


こんにちは、

WPF DataGridでセルがホバーされている行と列を強調表示したいと考えています。
DataGrid の選択単位がセルに設定されています
CellStyleを使用するだけでRowStyleとColumnStyleを使用していません
RowBackground を透明に設定しました。

RowStyle を使用せずにこれを実現するにはどうすればよいですか?

ありがとう

解決策 1

ねえ、これをチェックしてみてください。役立つ場合は

[^]

解決策 2

問題:
コードビハインドで設定されているデータ グリッド内の強調表示されたセルが、スクロールすると失われて飛び回ってしまうという問題が発生しています。 この問題は、データ グリッド行の仮想化に関連しているようです。

解決:
この問題に対処するには、新しいコンテンツが読み込まれた場合でも、各セルが背景色をいつ適用するかを確実に認識する必要があります。 これを実現する 1 つの方法は、セルが配置されている行の ViewModel とセルが配置されている列ヘッダーを使用することです。 これら 2 つの情報により、セルは色付けを適用するかどうかを正確に決定できます。

この解決策を実装する方法は次のとおりです。

CellInfo クラスを定義して、行の ViewModel と列ヘッダーをセル自身の位置を特定するための情報として保持します。

C#
public class CurrentCellInfo : DependencyObject
{
    // Dependency Property for ColumnHeader
    public static readonly DependencyProperty ColumnHeaderProperty =
        DependencyProperty.Register("ColumnHeader", typeof(string), typeof(CurrentCellInfo), new PropertyMetadata(default(string)));

    public string ColumnHeader
    {
        get => (string)GetValue(ColumnHeaderProperty);
        set => SetValue(ColumnHeaderProperty, value);
    }

    // Dependency Property for CurrentCellDataContext
    public static readonly DependencyProperty CurrentCellDataContextProperty =
        DependencyProperty.Register("CurrentCellDataContext", typeof(object), typeof(CurrentCellInfo), new PropertyMetadata(default(object)));

    public object CurrentCellDataContext
    {
        get => GetValue(CurrentCellDataContextProperty);
        set => SetValue(CurrentCellDataContextProperty, value);
    }
}

セルが新しいコンテンツを「吸収」するたびにこの情報をチェックするロジックを実装します。 これは、XAML で MultiDataTrigger を使用して実現できます。

XML
<DataGrid.Resources>
    <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}">
        <Style.Triggers>
            <!-- Use a MultiDataTrigger -->
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <!-- Check if DataContext values are equal using the MultiValueConverter -->
                    <Condition Value="True">
                        <Condition.Binding>
                            <MultiBinding Converter="{StaticResource EqualityMultiConverter}">
                                <Binding RelativeSource="{RelativeSource Self}" Path="DataContext"/>
                                <Binding ElementName="findAndReplace" Path="CurrentCellInfo.CurrentCellDataContext"/>
                            </MultiBinding>
                        </Condition.Binding>
                    </Condition>
                    <Condition Value="True">
                        <Condition.Binding>
                            <MultiBinding Converter="{StaticResource EqualityMultiConverter}">
                                <Binding RelativeSource="{RelativeSource Self}" Path="Column.Header" Mode="TwoWay"/>
                                <Binding ElementName="findAndReplace" Path="CurrentCellInfo.ColumnHeader" Mode="TwoWay"/>
                            </MultiBinding>
                        </Condition.Binding>
                    </Condition>
                </MultiDataTrigger.Conditions>
                <Setter Property="Background" Value="LightYellow"/>
            </MultiDataTrigger>
        </Style.Triggers>
    </Style>
</DataGrid.Resources>

EqualityMultiConverter を利用して、値を比較するロジックを実装します。

C#
public class EqualityMultiConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values.All(val => val is not null)) {
            if (values == null || values.Length < 2 || values.Any(v => v.ToString() == "{DisconnectedItem}"))
                return false;

            return object.Equals(values[0], values[1]);
        }
        return false;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

提供されたコード例では、CellInfo クラスのインスタンスを保持する「findAndReplace」という名前の要素を使用しました。 この要素は、現在どのセルがフォーカスまたは強調表示されているかを管理します。

これが、私と同じようにスクロール時のデータ グリッド セルの強調表示に関する同様の問題に直面している人に役立つことを願っています。 🙂

コメント

タイトルとURLをコピーしました