سؤال

لدي DataGrid التي أنا ملزم PagedCollectionView التي يتم تجميعها وفرزها.محتويات DataGrid غير قابلة للتعديل على الرغم من عمود واحد يحتوي على رابط قابل للنقر.

أنا قيدت SelectionMode من DataGrid إلى DataGridSelectionMode.Single الذي توقف متعددة اختيار صف واحد وهو أمر جيد.ولكن على الصف المحدد أيضا تحديد الخلية التي توجه في أخف قليلا من لون بقية الصف المحدد وله حدود.

أساسا أنا أحب أن يكون SelectedRow ولكن ليس SelectedCell (من UI/عرض منظور).

فإنه يشعر وكأنه ينبغي أن يكون مسألة بسيطة من تحديد الملكية ، ولكن لدي شعور ربما علي أن تحرير DataGrids القالب و/أو الفوضى مع VisualStateManager.

أنا سعيد أن تتحول إلى عنصر تحكم آخر بخلاف DataGrid ولكن لا تحتاج إلى أن تكون قادرة على عرض المجموعة.

هل كانت مفيدة؟

المحلول

وجدت 'a' طريقة صنع الخلايا الفردية يبدو أن عدم التحديد ، على الرغم من أنني لست متأكدا إن أفضل طريقة.
تحرير CellStyle على DataGrid تجد مستطيل اسمه FocusVisual.هذا هو المستطيل هذا يستخدم للإشارة إلى الخلية المحددة.مجموعة التعبئة & السكتة الدماغية شفافة ، أنا أيضا تعيين StrokeThickness إلى 0.لا حذف المستطيل تماما بسبب أشياء أخرى نتوقع أن يكون هناك.Xaml بدا شيء من هذا القبيل:

    <Style x:Key="NonSelectableDataGridCellStyle" TargetType="data:DataGridCell">
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        <Setter Property="VerticalContentAlignment" Value="Stretch"/>
        <Setter Property="IsTabStop" Value="False"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="data:DataGridCell">
                    <Grid x:Name="Root" Background="{TemplateBinding Background}">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CurrentStates">
                                <VisualState x:Name="Regular"/>
                                <VisualState x:Name="Current">
                                    <Storyboard>
                                        <DoubleAnimation Duration="0" 
                                            Storyboard.TargetName="FocusVisual" 
                                            Storyboard.TargetProperty="Opacity" To="1"/>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="ValidationStates">
                                <VisualState x:Name="Valid"/>
                                <VisualState x:Name="Invalid">
                                    <Storyboard>
                                        <DoubleAnimation Duration="0" Storyboard.TargetName="InvalidVisualElement" Storyboard.TargetProperty="Opacity" To="1"/>
                                        <ColorAnimation Duration="0" Storyboard.TargetName="FocusVisual" Storyboard.TargetProperty="(Fill).Color" To="#FFFFFFFF"/>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <Rectangle x:Name="FocusVisual" 
                            Fill="Transparent"
                            Stroke="Transparent"
                            StrokeThickness="0" 
                            HorizontalAlignment="Stretch" 
                            VerticalAlignment="Stretch" 
                            IsHitTestVisible="false" 
                            Opacity="0"
                                   />
                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
                        <Rectangle x:Name="InvalidVisualElement" Stroke="#FFDC000C" StrokeThickness="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsHitTestVisible="False" Opacity="0"/>
                        <Rectangle x:Name="RightGridLine" VerticalAlignment="Stretch" Width="1" Grid.Column="1"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

إضافة CellStyle إلى DataGrid

<data:DataGrid x:Name="uiDataGrid" 
           CellStyle="{StaticResource NonSelectableDataGridCellStyle}"
           >
     ...
</data:DataGrid>

نصائح أخرى

يمكنك أيضا إضافة "غير مرئية" عمود:

    <sdk:DataGrid.Columns>
    <sdk:DataGridTextColumn Binding="{Binding Path=Nothing}" MinWidth="0" MaxWidth="0" />

وجعلها الحالي كلما الخلية الحالية هو تغيير:

Private Sub _CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.CurrentCellChanged
    If Me.CurrentColumn IsNot Nothing Then Me.CurrentColumn = Me.Columns(0)
End Sub

هذا مناسب بالنسبة لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top