6

自从切换到 .NET 4.0 后,我遇到了数据输入问题。在我的 Xceed 3.7 网格中,用户过去可以在单元格中输入一个值,当他们点击离开或按 Enter 键时,ConvertBack将调用绑定转换器的方法,解析用户输入值并以所需格式存储。

现在突然之间,每次击键都会发生这种情况- 这会导致一个巨大的问题,因为如果用户删除一个数字并开始输入另一个数字(比如说 -100),一旦他们输入负号,就会转换回触发并抛出异常,因为“-”不是可解析的字符串,并且该值被还原。

我认为问题很清楚,所以现在我将粘贴一些代码。

用户输入的列如下所示:

<xcdg:DataGridControl x:Name="AggCatGrid01"
      ItemsSource="{Binding Source={StaticResource myDataSource}}" >
<xcdg:DataGridControl.Columns>
      ...
      <xcdg:Column VisiblePosition="0" FieldName="SomeValue" Title="Some Value"
                   CellEditor="{StaticResource PercentageEditor}"
                   CellContentTemplate="{StaticResource EditablePercent2CellContentTemplate}" />

数据网格都共享相同的样式:

<Style x:Key="{x:Type xcdg:DataGridControl}" TargetType="{x:Type xcdg:DataGridControl}">
    <Setter Property="UpdateSourceTrigger" Value="CellEndingEdit"/>
    <Setter Property="AutoCreateColumns" Value="False"/>
    <Setter Property="EditTriggers" Value="BeginEditCommand, CellIsCurrent, ActivationGesture"/>
    <Setter Property="CellEditorDisplayConditions" Value="CellIsCurrent"/>
    <Setter Property="NavigationBehavior" Value="CellOnly"/>

注意UpdateSourceTrigger设置为CellEndingEdit。我原以为这将负责何时调用转换器并更新绑定值。但是,只需切换 .NET4 即可更改任何控件。

这是您在上面看到的列的数据模板:

<!-- Styles used when editable cells are being edited. -->
<xcdg:CellEditor x:Key="PercentageEditor">
    <xcdg:CellEditor.EditTemplate>
        <DataTemplate>
            <xcdg:AutoSelectTextBox Style="{StaticResource DefaultAutoSelectTextBox}"
                                    Text="{xcdg:CellEditorBinding Converter={StaticResource EditablePercentageConverter}}" />
        </DataTemplate>
    </xcdg:CellEditor.EditTemplate>
</xcdg:CellEditor>

我认为转换器代码本身是无关紧要的,所以除非有要求,否则我会忽略它。问题是每次击键都会调用它。

如果你能对此有所了解,我会欣喜若狂。我的意思是,如果没有解决方案,我可能不得不回滚我的所有 .NET 4.0 增强功能,或者将我的下一个版本推迟一个月以上重写我所有的数据网格以不再使用 xceed。多谢你们。


更新#1

实际上,我想出了一个相当聪明的解决方法(在我看来),我引入了一个虚拟文本块来保存 CellEditorBinding xceed 迫使我们在数据模板中使用。然后我将输入控件更改为绑定到文本块的文本属性,而不是直接绑定到 CellEditorBinding,这使我可以指定自己的绑定模式。在这里,我可以将模式设置为“lostFocus”,主要问题就解决了!不再在每次击键时调用转换器,而是仅在用户离开单元格或按 Enter 时调用。

<xcdg:CellEditor x:Key="PercentageEditor">
    <xcdg:CellEditor.EditTemplate>
        <DataTemplate>
            <Grid>                        
                <TextBlock x:Name="bind_source" Text="{xcdg:CellEditorBinding}" Visibility="Collapsed"/>
                <xcdg:AutoSelectTextBox Style="{StaticResource DefaultAutoSelectTextBox}"
                    Text="{Binding ElementName=bind_source, Path=Text, Mode=TwoWay, UpdateSourceTrigger=LostFocus, Converter={StaticResource EditablePercentageConverter}}" />
            </Grid>
        </DataTemplate>
    </xcdg:CellEditor.EditTemplate>
</xcdg:CellEditor>

正如您可以想象的那样,这一层间接导致了一些其他小问题,例如破坏验证。奇怪的是,现在当用户输入无效数据时,转换器会抛出一个异常,xceed 捕获并使用它来打开单元格的错误模板,但纠正错误并按 Enter 不再起作用。用户唯一的选择是按下 ESC 键,使单元格值恢复并失去焦点,然后才能更正输入。

在这种情况下,用户必须按 ESC 才能继续编辑单元格。 简单地单击或将值更改回有效值是行不通的。

我仍然希望有一个更优雅的解决方案来解决这个问题。


更新#2

我在 Xceed 支持论坛上找到了一位开发人员,该开发人员在这篇文章中提出了与我相同的问题:http: //silverlightdatagrid.com/CS/forums/permalink/31548/31516/ShowThread.aspx#31516

许多用户似乎对您的示例完全感到困惑(对于 .Net 4.0,这些示例基本上已经过时),并且只使用xcdg:CellEditorBinding 来定位您自己的控件,它似乎只支持 PropertyChanged 验证

不幸的是,没有提供任何解决方案。他确实提出了一种更优雅地更改更新源触发器的策略,我可以采用该策略,但我仍然遇到验证错误冻结单元格直到用户点击 ESC 的问题。

<xcdg:AutoSelectTextBox Style="{StaticResource DefaultAutoSelectTextBox}"
     Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=xcdg:DataCell}, 
                    Path=Content, UpdateSourceTrigger=LostFocus, 
                    Converter={StaticResource EditablePercentageConverter}}" />

更新#3

我已经确认,通过更新到 Xceed DataGrid 4.3 版(试用版),问题自行消失了,因为在那个版本中,Xceed 更新了它xcdg:CellEditorBinding UpdateSourceTrigger与 .Net4.0 的不兼容性。然而,因为 Xceed 的许可证仅包含 6 个月的错误修复更新,然后您必须支付全新的许可证(荒谬),而且我没有看到任何公司授权 1200 美元的单一开发人员许可证费用来使用最新的Xceed dll 只是针对这个小错误,我仍然会努力在 3.7 版本的 Xceed 中找到完整的解决方法。我将为有机会烧钱的开发人员介绍这个“解决方案”。

事实证明,升级到 4.3 并没有解决问题。这似乎只是因为我忘记了退出我之前的更改。即使在最新版本中,Xceed 仍然没有在UpdateSourceTriggeron 上公开该属性CellEditorBinding

4

2 回答 2

3

解决方案是:

<xcdg:AutoSelectTextBox Style="{StaticResource DefaultAutoSelectTextBox}"
     Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=xcdg:DataCell}, 
                    Path=Content, UpdateSourceTrigger=LostFocus, 
                    Converter={StaticResource EditablePercentageConverter}}" />

真的没有别的办法了。如果您没有使用最新版本的 Xceed,这也会导致验证错误,但在最新版本中,使用这个新的绑定路径可以完美运行。我仍然认为这是一个 hack,希望 xceed 能够意识到它需要在其CellEditorBinding.

于 2012-01-31T13:54:08.303 回答
0

我不知道 XCeed 控件,所以这只是有根据的猜测。

我个人会将 UpdateSourceTrigger 放置到绑定声明中,就像在常规 .NET 控件中一样:

Text="{xcdg:CellEditorBinding Converter={StaticResource EditablePercentageConverter}, UpdateSourceTrigger=CellEndingEdit}"

此外,由于该控件是商业化的,您应该有权获得 XCeed 的一些技术支持。

于 2012-01-25T15:48:09.513 回答