it-swarm.com.de

Deaktivieren Sie die Auswahl in WPF DataGrid

Wie kann ich die Auswahl in einer WPFTookit-Variable DataGrid deaktivieren? Ich habe versucht, die für ListView geeignete Lösung zu ändern (von WPF ListView Auswahl deaktivieren ), aber das funktioniert nicht:

<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>
42
svick

Die saubere Methode wäre, die Stile der Zeile und der Zelle einfach zu überschreiben

<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>
30
Alex

Fügen Sie einfach IsHitTestVisible="False" zur DataGrid-Definition hinzu.

17
Yuri

Um die Auswahl von Zeilen in einem DataGrid vollständig zu deaktivieren, haben Sie folgende Möglichkeiten:

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

Dies kann als günstiger angesehen werden als die Einstellung von <Setter Property="IsEnabled" Value="False"/>, da durch das Ausführen der oben genannten Technik der Stil der Zeile geändert wird. Es verhindert auch nicht, dass Kontextmenüs angezeigt werden, wenn Sie mit der rechten Maustaste klicken. 

Schließlich gilt es zu beachten, dass die Einstellung " IsHitTestVisible " auf "False" die Interaktion von all mit den Zeilen deaktiviert, einschließlich der Bearbeitung.

Wenn Sie jedoch nur den Stil der Zeile ändern möchten, sehen Sie die Antworten hier .

11
Joshua

All dies sind gute Ideen für einfache Hacks. Sie tun jedoch nicht genau das, was gefragt wird. In den anderen Antworten erfahren Sie, wie Sie die Auswahl eines vom Benutzer ausgewählten Elements aufheben oder die Tatsache ausblenden, dass der Benutzer etwas ausgewählt hat.

Ich verstehe jedoch, warum diese Antworten gegeben werden. Es ist nicht leicht, die wirkliche Lösung bereitzustellen.

Die eigentliche Lösung besteht darin, die Auswahl von vornherein zu verhindern, was zwar nicht unkompliziert, aber mit ein paar einfachen Schritten möglich ist. 

Antwort 1. Sie müssen den Stil in Expression Blend kopieren (oder irgendwo eine Kopie des Stils finden) ... 2. Ändern Sie eine einzelne ItemPresenter-Einstellung. Es war genug für mich, IsHitTestVisible = "False" für den ItemPresenter festzulegen.

Wenn Sie weitere Informationen oder einen ausführlichen Durchgang benötigen, finden Sie in meinem Blogbeitrag:

Wie deaktiviere ich die Zeilenauswahl in einem WPF-DataGrid?

10
Rhyous

Wie von Sonic Soul hier ausgeführt, funktioniert die Lösung von viky nicht.

Hier ist der eigentliche Arbeitscode zum Deaktivieren der Auswahl in einem DataGrid:

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

Wenn Sie alternative Farben verwenden:

<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

Eine andere einfache Möglichkeit besteht darin, den Auswahlstil mit einem IsSelected-Trigger in Transparent zu ändern.

4
Mr. Snuggles

Die einzig richtige Methode, die ich gefunden habe, ist das Deaktivieren der IsHitTestVisible - Eigenschaft in DataGrid Row Style. 

Klickereignisse werden trotz der Benennung weiterhin registriert. Stellen Sie sicher, dass Sie diese Eigenschaft nicht für das gesamte DataGrid ändern, es sei denn, Sie möchten auch den Bildlauf deaktivieren. 

Eine saubere Methode hierfür ist ein neuer Stil in Ihren statischen Ressourcen (ggf. andere Setter kopieren).

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

und binden Sie es dann in Ihr DataGrid

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

Wenn jemand anderes mit demselben Problem konfrontiert ist, kann es hilfreich sein. 

Wir hatten die Anforderung, einige Zeilen auf Datagrid zu deaktivieren, aber gleichzeitig die Navigation mit den PFEILTASTEN ermöglichen. Deshalb mussten wir zu 'IsHitTestVisible' wechseln, anstatt die 'IsEnabled'-Eigenschaft zu steuern. Daher konnten wir uns nicht für die obige Lösung entscheiden, zur 'IsEnable'-Eigenschaft zu wechseln. 

So habe ich dieses Problem gelöst. Ich habe eine neue angefügte Eigenschaft (RowEnable) für DataGridRow erstellt. Diese angefügte Eigenschaft kann an eine Viewmodel-Eigenschaft gebunden werden, um die Aktivierung und Deaktivierung von 'virtuell' zu steuern. Ich habe auch einen neuen Stil für DataGridCell erstellt, in dem ich 'IsHitTestVisible' basierend auf derselben viewmodel-Eigenschaft auf false setzt. Betrachten Sie es als eine Reihe, die die Maus/Tastatur sehen kann, aber nicht die Zellen/Spalten. Dies bedeutet, dass ich die Zeile basierend auf der neuen angefügten Eigenschaft (RowEnabled) so gestalten kann, dass sie deaktiviert/aktiviert erscheint. Gleichzeitig kann ich Tooltips für diese Zeilen anzeigen, die virtuell deaktiviert sind.

0
Vipin Gupta

Ich brauchte einen Code hinter der Lösung. Das funktioniert bei mir:

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

Da es manchmal flackert, muss die BackgroundProperty auch auf transparent gesetzt werden.

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