web-dev-qa-db-ja.com

WPF DataGridでの選択を無効にする

WPFTooklitのDataGridで選択を無効にするにはどうすればよいですか? ListViewで動作するソリューションを変更しようとしました( WPF ListViewで選択をオフにする )が、動作しません:

<tk:DataGrid>
    <tk:DataGrid.ItemContainerStyle>
        <Style TargetType="{x:Type tk:DataGridRow}">
            <Setter Property="Focusable" Value="false"/>
        </Style>
    </tk:DataGrid.ItemContainerStyle>
    <tk:DataGrid.CellStyle>
        <Style TargetType="{x:Type tk:DataGridCell}">
            <Setter Property="Focusable" Value="false"/>
        </Style>
    </tk:DataGrid.CellStyle>
</tk:DataGrid>
47
svick

きれいな方法は、行とセルのスタイルをオーバーライドすることです

<DataGrid.Resources>
    <ResourceDictionary>
        <Style x:Key="{x:Type DataGridCell}" TargetType="{x:Type DataGridCell}">
            <Setter Property="Background" Value="{x:Null}" />
            <Setter Property="BorderBrush" Value="{x:Null}" />
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Background" Value="{x:Null}" />
                    <Setter Property="BorderBrush" Value="{x:Null}" />
                </Trigger>
            </Style.Triggers>
        </Style>
        <Style TargetType="{x:Type DataGridRow}">
            <Setter Property="Background" Value="{x:Null}" />
            <Setter Property="BorderBrush" Value="{x:Null}" />
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Background" Value="{x:Null}" />
                    <Setter Property="BorderBrush" Value="{x:Null}" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ResourceDictionary>
</DataGrid.Resources>
33
Alex

IsHitTestVisible="False"DataGrid定義に追加するだけです。

19
Yuri

DataGridの行の選択を完全に無効にするには、次の操作を実行できます。

<DataGrid>
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="IsHitTestVisible" Value="False"/>
        </Style>
    </DataGrid.RowStyle>
    <!--Other DataGrid items-->
</DataGrid>

これは、<Setter Property="IsEnabled" Value="False"/>前述の手法を実行すると、行のスタイルが変更されるためです。また、右クリックしてもコンテキストメニューが表示されることを無効にしません。

最後に、「 IsHitTestVisible 」を「False」に設定すると、編集を含め、行とのall対話が無効になることに注意することが重要です。 。

ただし、選択したときに行のスタイルを変更するだけの場合は、答えを表示してください here

14
Joshua

上記のすべては、簡単にハッキングするための良いアイデアです。しかし、彼らは求められていることを正確に行っていません。他の答えは、ユーザーが選択したものを選択解除する方法、またはユーザーが選択したものを隠す方法を教えています。

しかし、これらの答えが与えられる理由は理解しています。実際のソリューションを提供するのは簡単ではありません。

実際の解決策は、そもそも選択を防ぐことです。これは簡単ではありませんが、いくつかの簡単な手順で実行できます。

回答1. Expression Blendでスタイルをコピーする必要があります(または、スタイルのコピーをどこかに見つけます)。 2.単一のItemPresenter設定を変更します。 ItemPresenterでIsHitTestVisible = "False"を設定するだけで十分です。

さらに詳細が必要な場合、またはこれを行うための詳細なウォークスルーが必要な場合は、私のブログ投稿を参照してください。

WPF DataGridで行選択を無効にする方法

10
Rhyous

Sonic Soul here が指摘したように、vikyのソリューションは実際には機能しません。

DataGridで選択を無効にする実際の作業コードは次のとおりです。

grid.SelectionChanged += (obj, e) => 
  Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => 
    grid.UnselectAll())); 
8
Ray Burns

これを行うために私が見つけた唯一の適切な方法は、DataGrid Row StyleのIsHitTestVisibleプロパティを無効にすることです。

名前に関係なく、クリックイベントは引き続き登録されます。スクロールも無効にする場合を除き、DataGrid全体でこのプロパティを変更しないでください。

これを行うクリーンな方法は、静的リソースの新しいスタイルを使用することです(必要に応じて他のセッターをコピーします)

        <Style x:Key="DataGridUnselectableRowStyle" TargetType="{x:Type DataGridRow}">
            <Setter Property="IsHitTestVisible" Value="False"/>
        </Style>

それをDataGridにバインドします

        <DataGrid
            RowStyle="{StaticResource DataGridUnselectableRowStyle}" >
            <!-- Contents -->
        </DataGrid>
4
Mindaugas-kun

別の色を使用している場合:

<Style TargetType="{x:Type DataGrid}">
    <Setter Property="RowBackground" Value="#badeee"/>
    <Setter Property="AlternationCount" Value="2" />
    <Setter Property="AlternatingRowBackground" Value="#92cce5"/>
</Style>

<Style TargetType="{x:Type DataGridCell}">
    <Style.Triggers>           
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="BorderBrush" Value="Transparent"/>
            <Setter Property="Foreground" Value="Black"/>
        </Trigger>
    </Style.Triggers>
</Style>

<Style TargetType="{x:Type DataGridRow}">
    <Style.Triggers>
        <Trigger Property="ItemsControl.AlternationIndex" Value="0">
            <Setter Property="Background" Value="#badeee"></Setter>
            <Setter Property="BorderBrush" Value="#badeee"></Setter>
        </Trigger>
        <Trigger Property="ItemsControl.AlternationIndex" Value="1">
            <Setter Property="Background" Value="#92cce5"></Setter>
            <Setter Property="BorderBrush" Value="#92cce5"></Setter>
        </Trigger>
    </Style.Triggers>
</Style>
4
silver_mx

別の簡単な方法は、IsSelectedトリガーを使用して選択スタイルを透明に変更することです。

4
Mr. Snuggles

他の誰かが同じ問題に直面している場合、彼らはそれが役立つと思うかもしれません。

データグリッドのいくつかの行を無効にする必要がありましたが、同時にそれらの矢印キーのナビゲーションを許可しました。これが、「IsEnabled」プロパティを制御する代わりに「IsHitTestVisible」に切り替える必要があった理由です。そのため、上記の「IsEnable」プロパティに切り替えるソリューションを採用できませんでした。

この問題を解決する方法を次に示します。 DataGridRowの新しい添付プロパティ(RowEnable)を作成しました。この添付プロパティをviewmodelプロパティにバインドして、「仮想」の有効化と無効化を制御できます。また、同じviewmodelプロパティに基づいて 'IsHitTestVisible'をfalseに設定するDataGridCellの新しいスタイルを作成しました。したがって、マウス/キーボードは表示できますが、セル/列は表示できない行のように考えてください。つまり、新しい添付プロパティ(RowEnabled)に基づいて行をスタイル設定して、無効/有効に見えるようになりました。同時に、実質的に無効になっているこれらの行のツールチップを表示できます。

0
Vipin Gupta

ソリューションの背後にあるコードが必要でした。これは私のために働く:

controlGrid.SelectedCellsChanged += (sender, e) =>
    Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Render, new Action(() =>
        controlGrid.UnselectAll()));
controlGrid.Columns.Clear();

時々ちらつくので、BackgroundPropertyも透明に設定されます。

Style dataGridCellStyle = new Style(typeof(DataGridCell));
Setter newSetterCell = new Setter(DataGridCell.BackgroundProperty, Brushes.Transparent);
dataGridCellStyle.Setters.Add(newSetterCell);
controlGrid.CellStyle = dataGridCellStyle;
0
marsh-wiggle