下面是我在 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/