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

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

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

<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"