以下是我在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松散焦点时,我需要对文本进行验证。
是否有可能以某种方式同时使用这两个属性?
答案 0 :(得分:0)
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"