c# - 我可以同时使用 PropertyChanged 和 LostFocus 吗?

标签 c# wpf xaml mvvm

下面是我在 WPF MVVM 结构中的 View 代码的一部分。

<TextBox Name="VehicalNo_Text" Height="23" Width="80" TextWrapping="Wrap" Text="{Binding VehicleNo, UpdateSourceTrigger=PropertyChanged}"  HorizontalAlignment="Left" />
...                                   
<TextBlock Name="Preview" Text="{Binding EditText, UpdateSourceTrigger=PropertyChanged}"/>
...

我遇到过需要同时使用这两个触发器的情况。

当我更新 TextBox 中的任何内容时,我需要立即在我的预览 TextBlock 中显示它。 (在 ViewModel 中,EditText 间接来自 VehicleNo 本身...),如您在代码中所见,它已经实现。

现在我需要的是当 TextBox 失去焦点时,我需要对文本进行验证。

有没有可能同时使用这两个属性?

最佳答案

TextBlock 中的

UpdateSourceTrigger=PropertyChanged 无效

你可以这样试试

<TextBox Name="VehicalNo_Text" Height="23" Width="80" TextWrapping="Wrap" 
         Text="{Binding VehicleNo, UpdateSourceTrigger=LostFocus}" 
         HorizontalAlignment="Left" />
...                                   
<TextBlock Name="Preview" Text="{Binding Text, ElementName=VehicalNo_Text}"/>

在上面的示例中,我们将预览 TextBlock 的 Text 属性绑定(bind)到 TextBox 的 Text 属性,而不是 View 模型属性

这将使您能够看到实时预览,同时仅在失去焦点时保持 View 模型更新。

编辑

为了验证属性,您可以在 TextBox 的绑定(bind)上应用验证规则

例如

<TextBox Name="VehicalNo_Text">
    <TextBox.Text>
        <Binding Path="VehicleNo" UpdateSourceTrigger="LostFocus">
            <Binding.ValidationRules>
                <ExceptionValidationRule />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

您可以替换 ExceptionValidationRule 或添加您自己的规则。

其次,您可以使用转换器根据 VehicleNo 的值显示预览,而不是计算属性

例如

<TextBlock Name="Preview" Text="{Binding Text, ElementName=VehicalNo_Text, Converter={StaticResource VehicalNoConverter}}"/>

关于c# - 我可以同时使用 PropertyChanged 和 LostFocus 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25153811/

相关文章:

c# - 处理带有动态列的表的最佳方法

c# - 如何让wpf webview像浏览器一样滚动?

WPF 旋转文本

c# - 使用 WrapPanel 指定每行的项目数

c# - Entity Framework 更改 Id 类型

c# - 将查询结果显示为以逗号分隔的文字

c# - 如何通过更改文本来更改组合框中的下拉项?

c# - 在 Windows 8 Metro App 中拖放图像

c# - 为什么我的触发器以空白控件结束?

c# - DataGridViewComboBoxColumn 中的选定项始终检索第一个值