C# 在WPF中使用BindingExpression的最佳实践?
我有一些UI元素,它们在代码隐藏中执行特定于UI的工作,然后在数据上下文中更新绑定 WPF要素:C# 在WPF中使用BindingExpression的最佳实践?,c#,wpf,data-binding,mvvm,C#,Wpf,Data Binding,Mvvm,我有一些UI元素,它们在代码隐藏中执行特定于UI的工作,然后在数据上下文中更新绑定 WPF要素: <TextBox Grid.Row="1" Text="{Binding PartNumber, UpdateSourceTrigger=Explicit}" Name="ui_partNumber" FontSize="35" VerticalContentAlignment="C
<TextBox Grid.Row="1"
Text="{Binding PartNumber, UpdateSourceTrigger=Explicit}"
Name="ui_partNumber"
FontSize="35"
VerticalContentAlignment="Center" />
<Button Grid.Column="1"
Grid.Row="1"
Content="OK"
Click="PartOKClick"
FontSize="20"
Width="150" />
<TextBox Grid.Row="1"
Text="{Binding PartNumber, ValidatesOnDataErrors=True}"
Name="ui_partNumber"
FontSize="35"
VerticalContentAlignment="Center" />
<Button Grid.Column="1"
Grid.Row="1"
Content="OK"
Click="PartOKClick"
FontSize="20"
Width="150" />
我使用的是显式绑定,只有在情况正常时才更新源代码,否则我只是恢复到原始绑定
问题是,这是明确使用绑定的最佳方式吗?如果我得到100个不同类型的元素的BindingExpression,那么每次都需要手工完成吗?我能以一种更可重复使用的方式进行吗?如果我理解正确,您愿意检查
文本框中输入的值,并仅在该值有效时更新绑定,对吗
幸运的是,WPF有一个内置的错误处理过程,它比您在那里所做的更干净。您应该阅读一些关于IDataErrorInfo
例如,在您的案例中,您会有如下内容:
WPF要素:
<TextBox Grid.Row="1"
Text="{Binding PartNumber, UpdateSourceTrigger=Explicit}"
Name="ui_partNumber"
FontSize="35"
VerticalContentAlignment="Center" />
<Button Grid.Column="1"
Grid.Row="1"
Content="OK"
Click="PartOKClick"
FontSize="20"
Width="150" />
<TextBox Grid.Row="1"
Text="{Binding PartNumber, ValidatesOnDataErrors=True}"
Name="ui_partNumber"
FontSize="35"
VerticalContentAlignment="Center" />
<Button Grid.Column="1"
Grid.Row="1"
Content="OK"
Click="PartOKClick"
FontSize="20"
Width="150" />
这应该可以帮到你:如果返回字符串“Not valid!”,则文本框
将显示一个红色边框,绑定
将不会更新如果我理解正确,你愿意检查文本框
中输入的值,并仅在绑定有效时更新绑定,对吗
幸运的是,WPF有一个内置的错误处理过程,它比您在那里所做的更干净。您应该阅读一些关于IDataErrorInfo
例如,在您的案例中,您会有如下内容:
WPF要素:
<TextBox Grid.Row="1"
Text="{Binding PartNumber, UpdateSourceTrigger=Explicit}"
Name="ui_partNumber"
FontSize="35"
VerticalContentAlignment="Center" />
<Button Grid.Column="1"
Grid.Row="1"
Content="OK"
Click="PartOKClick"
FontSize="20"
Width="150" />
<TextBox Grid.Row="1"
Text="{Binding PartNumber, ValidatesOnDataErrors=True}"
Name="ui_partNumber"
FontSize="35"
VerticalContentAlignment="Center" />
<Button Grid.Column="1"
Grid.Row="1"
Content="OK"
Click="PartOKClick"
FontSize="20"
Width="150" />
这应该可以帮到你:如果返回字符串“Not valid!”,则文本框将显示一个红色边框,并且绑定将不会更新为什么要强制使用显式绑定?为什么不在ViewModel中进行验证,然后仅在需要更新时触发OnPropertyChanged(“BindingParameter”)呢
类似这样的内容(在VB中):
为什么要强制使用显式绑定?为什么不在ViewModel中进行验证,然后仅在需要更新时触发OnPropertyChanged(“BindingParameter”)呢
类似这样的内容(在VB中):
我过去曾使用过IDataErrorInfo,但它不适合我在这里的应用。我的例子很简单,但有时我需要在代码中做更多的工作,除了做一些动画(我意识到在这种情况下我可以使用数据触发器)。我之所以选择显式绑定,是因为我需要更多的验证自由度,以及更少的“触发”开销,而这正是我在使用更严格的MVVM时所经历的。所以我的问题更多的是关于BindingExpression的使用+1对于建议,什么需求可能会阻止您使用传统的IDataErrorInfo
+触发器
?既然您提到了最佳实践,我相信使用它们是这方面最佳实践的一部分。如果您可以添加一些代码/detailsIDataErrorInfo,也许您的问题可以通过使用它来解决。在这个实例中,没有任何东西阻止我使用它。我的问题不是关于数据验证,而是关于显式更新绑定。另一个简单的例子是在更新绑定之前添加一个确认UI元素:“您确定要foo吗?”Yes=updatesource,No=updatetarget,用户只需通过所有验证,只需单击cancel
按钮而不是save
按钮,我想忽略有界控件中的所有更改并显示源代码中的原始数据。在这种情况下,DataErrorInfo
+触发器
将不起作用,因为所有输入的数据都是有效的。我以前使用过IDataErrorInfo,但它不适合我在这里的应用程序。我的例子很简单,但有时我需要在代码中做更多的工作,除了做一些动画(我意识到在这种情况下我可以使用数据触发器)。我之所以选择显式绑定,是因为我需要更多的验证自由度,以及更少的“触发”开销,而这正是我在使用更严格的MVVM时所经历的。所以我的问题更多的是关于BindingExpression的使用+1对于建议,什么需求可能会阻止您使用传统的IDataErrorInfo
+触发器
?既然您提到了最佳实践,我相信使用它们是这方面最佳实践的一部分。如果您可以添加一些代码/detailsIDataErrorInfo,也许您的问题可以通过使用它来解决。在这个实例中,没有任何东西阻止我使用它。我的问题不是关于数据验证,而是关于显式更新绑定。另一个简单的例子是在更新绑定之前添加一个确认UI元素:“您确定要foo吗?”Yes=updatesource,No=updatetarget,用户只需通过所有验证,只需单击cancel
按钮而不是save
按钮,我想忽略有界控件中的所有更改并显示源代码中的原始数据。在这种情况下,<>代码> DATAORORIONFION/COD> >代码>触发器将不起作用,因为所有输入的数据都是有效的。因为我不希望VIEW模型在视图准备发送之前更新一个更新。您可以使用像MVVM基金会这样的弱消息系统,在VIEW模型中有一个监听器,它可以关闭OnPrimTyType。事件。因为我不希望VIEW模型在视图准备发送之前更新一个更新。您可以使用像MVVM基金会这样的弱消息系统,并且在VIEW模型中有一个监听器,它触发OnPrimTyTrchange事件。您有没有解决问题的解决方案?对于网格而不是所有控件,可能有一个Explicit
选项,并对所有有界控件调用UpdateSource
一次。仅用于Cancel
按钮对于未回答的问题,您是否有解决方案?可能有一个显式选项