programing

WPF 데이터 그리드에서 선택 사용 안 함

jooyons 2023. 5. 5. 09:38
반응형

WPF 데이터 그리드에서 선택 사용 안 함

WP Tooklit에서 ?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>

깨끗한 방법은 행과 셀의 스타일을 덮어쓰는 것입니다.

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

데이터 그리드에서 행 선택을 완전히 비활성화하려면 다음을 수행할 수 있습니다.

<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"로 설정하면 편집을 포함하여 행과의 모든 상호 작용이 비활성화됩니다.

그러나 행을 선택할 때 행의 스타일을 변경하기만 하면 되는 경우 여기에서 답변을 확인하십시오.

간히추가를 추가합니다.IsHitTestVisible="False"DataGrid정의.

위의 모든 것은 쉬운 해킹을 위한 좋은 아이디어입니다.하지만, 그들은 정확히 요청받은 것을 하고 있지 않습니다.다른 답변은 사용자가 선택한 항목을 선택 취소하거나 사용자가 선택한 항목을 숨기는 방법을 알려줍니다.

하지만, 저는 왜 이런 대답이 나오는지 이해합니다.진정한 해결책을 제공하는 것은 쉽지 않습니다.

진정한 해결책은 애초에 선택을 막는 것인데, 이는 간단하지 않지만 몇 가지 쉬운 단계로 수행할 수 있습니다.

정답 1.표현식 혼합에서 스타일을 복사해야 합니다(또는 스타일의 복사본을 참조하십시오.단일 ItemPresenter 설정을 변경합니다.IsHitTestVisible=을 설정하기에 충분했습니다."항목 발표자에 "False"가 표시됩니다.

자세한 내용이나 자세한 설명이 필요한 경우 블로그 게시물을 참조하십시오.

WPF 데이터 그리드에서 행 선택을 비활성화하는 방법은 무엇입니까?

여기서 Sonic Soul이 지적한 바와 같이, viky의 솔루션은 실제로 작동하지 않습니다.

다음은 데이터 그리드에서 선택을 비활성화하는 실제 작업 코드입니다.

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

이렇게 하는 유일한 방법은 DataGridRowStyle에서 IsHitTestVisible 속성을 비활성화하는 것입니다.

클릭 이벤트는 이름 지정에도 불구하고 계속 등록됩니다.스크롤을 사용하지 않으려면 전체 데이터 그리드에서 이 속성을 변경하지 마십시오.

이를 위한 깨끗한 방법은 정적 리소스의 새로운 스타일을 사용하는 것입니다(다른 설정자를 적절하게 복사).

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

데이터 그리드에 바인딩할 수 있습니다.

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

다른 간단한 방법은 IsSelected 트리거가 있는 선택 유형을 투명으로 변경하는 것입니다.

대체 색상을 사용하는 경우:

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

만약 다른 사람이 같은 문제에 직면한다면, 그들은 그것이 도움이 될 것이라고 생각할 것입니다.

데이터 그리드에서 몇 개의 행을 비활성화해야 하지만 동시에 ARROW 키 탐색을 허용해야 했습니다.따라서 'IsEnabled' 속성을 제어하는 대신 'IsHitTestVisible'로 전환해야 했습니다.따라서 'IsEnable' 속성으로 전환하는 위의 솔루션을 채택할 수 없었습니다.

제가 이 문제를 해결하게 된 방법은 다음과 같습니다.DataGridRow에 대한 새 연결 속성(RowEnable)을 생성했습니다.이 연결된 속성을 뷰 모델 속성에 바인딩하여 '가상' 사용 및 사용 안 함을 제어할 수 있습니다.또한 동일한 뷰 모델 속성을 기준으로 'IsHitTestVisible'을 false로 설정하는 DataGridCell에 대한 새 스타일을 만들었습니다.따라서 마우스/키보드는 볼 수 있지만 셀/열은 볼 수 없는 행과 같은 것으로 간주합니다.즉, 이제 새 연결 속성(RowEnabled)을 기준으로 행을 비활성화/활성화된 것처럼 보이도록 스타일을 지정할 수 있습니다.동시에 사용할 수 없는 행에 대한 도구 설명을 볼 수 있습니다.

해결책에 대한 암호가 필요했습니다.이것은 나에게 도움이 됩니다.

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

때때로 깜박이기 때문에 백그라운드 속성도 투명으로 설정됩니다.

Style dataGridCellStyle = new Style(typeof(DataGridCell));
Setter newSetterCell = new Setter(DataGridCell.BackgroundProperty, Brushes.Transparent);
dataGridCellStyle.Setters.Add(newSetterCell);
controlGrid.CellStyle = dataGridCellStyle;
<DataGrid isEnabled="False">
</DataGrid>

WPF 데이터 그리드에서 선택하지 않도록 설정하는 것이 질문에 직접 대답할 수 있는 가장 간단한 방법입니다.

이것을 위한 속임수가 있습니다.DataGrid(saydgGrid)의 SelectionChanged 이벤트를 처리하고 핸들러에 다음과 같이 기록할 수 있습니다.

dgGrid.UnselectAll();

선택한 모든 행의 선택이 취소되고 결과는 "No row selected"가 됩니다.

언급URL : https://stackoverflow.com/questions/2496814/disable-selecting-in-wpf-datagrid

반응형