我可以一起使用PropertyChanged和LostFocus吗?

时间:2014-08-06 06:42:48

标签: 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松散焦点时,我需要对文本进行验证。

是否有可能以某种方式同时使用这两个属性?

2 个答案:

答案 0 :(得分:0)

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属性绑定到TextBox的Text属性而不是视图模型属性

这样您就可以看到实时预览,同时仅在丢失焦点上保持视图模型更新。

修改

为了验证属性,您可以在TextBox的绑定

上应用验证规则

例如

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

答案 1 :(得分:0)

无法在xaml中设置两种模式(例如PropertyChanged | LostFocus),但是有解决方法。假设您有Slider,并且您想在ViewModel中对Value更改和焦点丢失事件做出反应(实际上我使用LostMouseCapture事件)

<Slider Value="{Binding NewValue, UpdateSourceTrigger=PropertyChanged}">
    <b:Interaction.Triggers>
        <b:EventTrigger EventName="LostMouseCapture">
            <b:InvokeCommandAction Command="{Binding SliderLostFocusCommand}"/>
        </b:EventTrigger>
    </b:Interaction.Triggers>
</Slider>

您还必须在xaml中包含此命名空间

xmlns:b="clr-amespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"