C# 在WPF中使用BindingExpression的最佳实践?

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

我有一些UI元素,它们在代码隐藏中执行特定于UI的工作,然后在数据上下文中更新绑定

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" />
我使用的是显式绑定,只有在情况正常时才更新源代码,否则我只是恢复到原始绑定


问题是,这是明确使用绑定的最佳方式吗?如果我得到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
按钮对于未回答的问题,您是否有解决方案?可能有一个
显式
选项