C# 我可以同时使用PropertyChanged和LostFocus吗?
下面是我在WPF MVVM结构中查看代码的一部分C# 我可以同时使用PropertyChanged和LostFocus吗?,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,下面是我在WPF MVVM结构中查看代码的一部分 <TextBox Name="VehicalNo_Text" Height="23" Width="80" TextWrapping="Wrap" Text="{Binding VehicleNo, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" /> ... <TextBlo
<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}"/>
...
...
...
我遇到了一个需要同时使用这两个触发器的情况
i、 e
当我更新文本框中的任何内容时,我需要立即在预览文本块中显示它。(在ViewModel EditText中,文本间接来自VehicleNo本身…),正如您在代码中看到的,它已经实现了
现在我需要的是当TextBox失去焦点时,我需要在文本上进行验证
是否可以同时使用这两个属性?文本块中的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}"/>
...
在上面的示例中,我们将preview TextBlock的文本属性绑定到TextBox的文本属性,而不是视图模型属性
这将使您能够查看实时预览,同时仅在失去焦点时保持视图模型更新
编辑
为了验证属性,可以对TextBox的绑定应用验证规则
乙二醇
您可以用自己的规则替换ExceptionValidationRule或add
其次,您可以使用转换器根据VehicleNo的值显示预览,而不是使用计算属性
乙二醇
在xaml中不可能同时设置这两种模式(例如PropertyChanged | LostFocus),但有解决办法。假设您有滑块,并且希望在ViewModel中对值更改和焦点丢失事件做出反应(实际上我使用的是LostMouseCapture事件)
正如我所说,该属性已经在为我工作,因为我已将EditText与ViewModel中的VehicleNo绑定。我担心的只是我同时设置这两个的问题。我的软件也需要这样做,因为很多这样的文本框都连接到这个预览。看起来你还没有理解我的问题。从我所看到的,当文本框失去焦点时,您希望在添加属性值验证的同时保持绑定的完整性。为了实现这一点,您可能需要调整代码以保持原始值(因为当前值将被覆盖),并在文本框失去焦点时进行比较,必要时进行恢复。我建议您使用一种方法,它不要求您在保持所需行为的同时保持原始值。确切地说,这两种触发器并不同时适用,因为它们的行为是相互矛盾的。为此,您可能必须实现自己的机制。
<TextBox Name="VehicalNo_Text">
<TextBox.Text>
<Binding Path="VehicleNo" UpdateSourceTrigger="LostFocus">
<Binding.ValidationRules>
<ExceptionValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<TextBlock Name="Preview" Text="{Binding Text, ElementName=VehicalNo_Text, Converter={StaticResource VehicalNoConverter}}"/>
<Slider Value="{Binding NewValue, UpdateSourceTrigger=PropertyChanged}">
<b:Interaction.Triggers>
<b:EventTrigger EventName="LostMouseCapture">
<b:InvokeCommandAction Command="{Binding SliderLostFocusCommand}"/>
</b:EventTrigger>
</b:Interaction.Triggers>
</Slider>
xmlns:b="clr-amespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"