gpt4 book ai didi

wpf - 每次击键而不是在用户输入结束时都调用转换器

转载 作者:行者123 更新时间:2023-12-02 01:45:31 25 4
gpt4 key购买 nike

自切换到.NET 4.0以来,我在数据输入方面遇到了问题。
在我的Xceed 3.7网格中,用户曾经能够在单元格中键入一个值,然后单击或单击Enter时,将调用绑定(bind)转换器的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。我本以为在调用转换器和更新绑定(bind)值时,这里的权利将负责。但是,只要通过切换.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迫使我们在数据模板中使用。然后,我将输入控件更改为绑定(bind)到文本块的text属性,而不是直接绑定(bind)到CellEditorBinding,这使我可以指定自己的绑定(bind)模式。在这里,我可以将模式设置为“lostFocus”,并且解决了主要问题!不再在每次击键时都调用Converter,而仅在用户离开单元格或按回车键时才调用Converter。
<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键,使单元格值恢复原状并失去焦点。

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

更新#2

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

Many users seem totally confused by your examples (which are largely out of date for .Net 4.0) and only target your own controls using the xcdg:CellEditorBinding which only seems to support PropertyChanged validation.



不幸的是,没有提供解决方案。他确实提出了一种可以更优雅地更改更新源触发器的策略,该策略我可以采用,但是我仍然遇到验证错误卡住单元格直到用户按下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仍未在UpdateSourceTrigger上公开CellEditorBinding属性。

最佳答案

解决方案是:

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

确实没有其他方法可以做到。如果您没有使用最新版本的Xceed,这也会导致验证错误,但是在最新版本中,使用此新绑定(bind)路径的效果很好。我仍然认为这是一个hack,希望xceed会意识到它需要在 CellEditorBinding上公开更多属性。

关于wpf - 每次击键而不是在用户输入结束时都调用转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9004625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com