Почему мой DataGridCell отклоняет каждый ввод? - PullRequest
0 голосов
/ 29 января 2019

У меня есть два TabItems, каждый из которых содержит DataGrid, и в обоих я реализую INotifiyDataErrorInfo.Оба DataGrids снабжены ViewModel с базовым классом модели (POCO).В первом TabItem все работает как требуется, но во втором TabItem DataGrid принимает ввод только в проверенных полях / ячейках.другие / неподтвержденные поля / ячейки позволяют мне вводить данные, но когда ячейки теряют фокус, новые введенные символы отбрасываются / отклоняются.

В чем может быть причина?

Работающий TabItem/ DataGrid:

<UserControl x:Class="ConfigTool.Controls.RawTagTabItem"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:ct_ctrls="clr-namespace:ConfigTool.Controls"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">

<Grid>
    <ct_ctrls:CTDataGrid x:Name="tagsGrid" ItemsSource="{Binding}" GridLinesVisibility="Vertical" AlternatingRowBackground="#C3DDE5" 
                         AutoGenerateColumns="False" CanUserAddRows="True" IsReadOnly="False" 
                         SelectionUnit="FullRow" SelectionMode="Extended" BorderThickness="3" CellEditEnding="CellEditingEnds" RowStyle="{StaticResource RawTagDataGridRow}">
        <DataGrid.Columns>
            <DataGridTextColumn x:Name="TagName" Header="Tag" Width="*" 
                                Binding="{Binding Mode=TwoWay, Path=RawTag.TagName, UpdateSourceTrigger=PropertyChanged, ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}"
                                ElementStyle="{StaticResource ResourceKey=textBlockErrStyle}" />
            <DataGridTextColumn x:Name="TagCycle" Header="Cycle" 
                                Binding="{Binding Mode=TwoWay, Path=RawTag.Cycle, UpdateSourceTrigger=PropertyChanged, ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}" 
                                ElementStyle="{StaticResource ResourceKey=textBlockErrStyle}">
            </DataGridTextColumn>
            <DataGridTextColumn x:Name="TagSource" Header="Source" Width="*" 
                                Binding="{Binding Mode=TwoWay, Path=RawTag.Source, UpdateSourceTrigger=PropertyChanged, ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}"
                                ElementStyle="{StaticResource ResourceKey=textBlockErrStyle}"/>
            <DataGridTextColumn x:Name="Unassigned" Header="unassigned" Width="*" 
                                Binding="{Binding Mode=OneWay, Path=RawTag.Unassigned, UpdateSourceTrigger=PropertyChanged, ValidatesOnNotifyDataErrors=False}"
                                ElementStyle="{StaticResource ResourceKey=textBlockUnassignedStyle}"/>
            <DataGridTemplateColumn x:Name="editTagColumn" Header="" CanUserResize="True" >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <WrapPanel>
                            <Button x:Name="btnTagDelete" Click="BtnTagDelete_Click" CommandParameter="{Binding}" Height="15" Width="15" Margin="2">
                                <Button.Content>
                                    <Image Source="../Resources/delete.png"></Image>
                                </Button.Content>
                            </Button>
                        </WrapPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </ct_ctrls:CTDataGrid>
</Grid>

НЕ рабочий TabItem / DataGrid:

<UserControl x:Class="ConfigTool.Controls.RawNotificationTabItem"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:ct_ctrls="clr-namespace:ConfigTool.Controls"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">

<Grid>
    <ct_ctrls:CTDataGrid x:Name="notificationsGrid" ItemsSource="{Binding}" GridLinesVisibility="Vertical" AlternatingRowBackground="#C3DDE5" 
                         AutoGenerateColumns="False" CanUserAddRows="True" IsReadOnly="False" 
                         SelectionUnit="FullRow" SelectionMode="Extended" BorderThickness="3" CellEditEnding="CellEditingEnds" RowStyle="{StaticResource NotificationDataGridRow}">
            <DataGrid.Resources>
            <Style x:Key="wordWrapStyleView" TargetType="{x:Type TextBlock}">
                <Setter Property="TextWrapping" Value="Wrap"/>
            </Style>
            <Style x:Key="wordWrapStyleEdit" TargetType="{x:Type TextBox}">
                <Setter Property="TextWrapping" Value="Wrap"/>
            </Style>
        </DataGrid.Resources>

        <DataGrid.Columns>

            <DataGridTemplateColumn Header="Tag">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Grid>
                            <ct_ctrls:TextWithSuggestionControl x:Name="test" DataContext="{Binding}" ItemsSource="{Binding Path=Tags}" 
                                      Value="{Binding Path=Notification.TagName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Append="False"/>
                        </Grid>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTextColumn Header="Nid" Binding="{Binding Mode=TwoWay, Path=Notification.Nid}"/>

            <DataGridCheckBoxColumn Header="Active" Binding="{Binding Mode=TwoWay, Path=Notification.IsActive, Converter={StaticResource StringBoolConverter}}" IsThreeState="False"/>

            <DataGridTextColumn Header="Type" Binding="{Binding Mode=TwoWay, Path=Notification.Type}"/>

            <DataGridTextColumn Header="Limit" Binding="{Binding Mode=TwoWay, Path=Notification.Limit}">
                <Validation.ErrorTemplate>
                    <ControlTemplate>
                        <StackPanel>
                            <AdornedElementPlaceholder x:Name="Limit"/>
                            <TextBlock Text="{Binding [0].ErrorContent}" Background="Red"/>
                        </StackPanel>
                    </ControlTemplate>
                </Validation.ErrorTemplate>
            </DataGridTextColumn>

            <DataGridTemplateColumn Header="Operator">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Grid>
                            <ComboBox x:Name="notificationOp" DataContext="{Binding}" ItemsSource="{Binding Path=Operations}" 
                                          Text="{Binding Path=Notification.Op}" IsEditable="False" VerticalAlignment="Top"
                                          SelectedItem="{Binding Path=Notification.Op, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" >
                            </ComboBox>
                        </Grid>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTextColumn Header="Text" Binding="{Binding Mode=TwoWay, Path=Notification.Text}"/>

            <DataGridTextColumn Header="Deadband" Binding="{Binding Mode=TwoWay, Path=Notification.Deadband}">
                <DataGridTextColumn.ElementStyle>
                    <Style TargetType="TextBlock">
                        <Setter Property="HorizontalAlignment" Value="Right" />
                    </Style>
                </DataGridTextColumn.ElementStyle>
            </DataGridTextColumn>

            <DataGridTextColumn Header="Delay" ElementStyle="{StaticResource ResourceKey=textBlockErrStyle}"
                                Binding="{Binding Mode=TwoWay, Path=Notification.Delay, UpdateSourceTrigger=PropertyChanged, ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}">
                <DataGridTextColumn.CellStyle>
                    <Style >
                        <Setter Property="FrameworkElement.HorizontalAlignment" Value="Stretch"/>
                        <Setter Property="TextBlock.TextAlignment" Value="Right"/>
                    </Style>
                </DataGridTextColumn.CellStyle>
            </DataGridTextColumn>

            <DataGridTextColumn Header="Expand" ElementStyle="{StaticResource ResourceKey=textBlockErrStyle}" 
                                Binding="{Binding Mode=TwoWay, Path=Notification.Expand, UpdateSourceTrigger=PropertyChanged, ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}">
                <DataGridTextColumn.CellStyle>
                    <Style >
                        <Setter Property="FrameworkElement.HorizontalAlignment" Value="Stretch"/>
                        <Setter Property="TextBlock.TextAlignment" Value="Right"/>
                    </Style>
                </DataGridTextColumn.CellStyle>
            </DataGridTextColumn>

            <DataGridTextColumn Header="SampleCount" ElementStyle="{StaticResource ResourceKey=textBlockErrStyle}" 
                                Binding="{Binding Mode=TwoWay, Path=Notification.SampleCount, UpdateSourceTrigger=PropertyChanged, ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}">
                <DataGridTextColumn.CellStyle>
                    <Style >
                        <Setter Property="FrameworkElement.HorizontalAlignment" Value="Stretch"/>
                        <Setter Property="TextBlock.TextAlignment" Value="Right"/>
                    </Style>
                </DataGridTextColumn.CellStyle>
            </DataGridTextColumn>

            <DataGridTemplateColumn Header="DetailTemplate">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Grid>
                            <ct_ctrls:TextWithSuggestionControl x:Name="test" DataContext="{Binding}" ItemsSource="{Binding Path=DetailTemplates}" 
                                       Value="{Binding Path=Notification.DetailTemplate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Append="False"/>
                        </Grid>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTemplateColumn Header="DetailParams" Width="300" >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Grid>
                            <ct_ctrls:TextWithSuggestionControl x:Name="test" DataContext="{Binding}" ItemsSource="{Binding Path=Tags}" 
                                  Value="{Binding Path=Notification.DetailParamsString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Append="True"/>
                        </Grid>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTextColumn Header="unassigned" 
                                Binding="{Binding Mode=OneWay, Path=Notification.Unassigned, ValidatesOnDataErrors=False, NotifyOnValidationError=False}"
                                ElementStyle="{StaticResource ResourceKey=textBlockUnassignedStyle}"/>

            <DataGridTemplateColumn x:Name="EditNotificationsColumn" Header="">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <WrapPanel>
                            <Button x:Name="btnNotificationDelete" Click="BtnNotificationDelete_Click" Height="15" Width="15" Margin="2">
                                <Image Source="../Resources/delete.png"></Image>
                            </Button>
                        </WrapPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </ct_ctrls:CTDataGrid>
</Grid>

Сетки данных заполненыпосле прочтения файлов CSV ... только попытка изменить (неподтвержденные) ячейки (которые на самом деле являются DataGridTextColumns и DataGridCheckboxColumns) вызывает проблему.

1 Ответ

0 голосов
/ 29 января 2019

Это довольно просто: делай это правильно, и это работает!;-) Я просто забыл добавить UpdateSourceTrigger = PropertyChanged в привязку ячеек, которые отклонили ввод.

...