我有一个TextBox显示DateTime的时间部分:
<TextBox HorizontalAlignment="Left" Height="23" Margin="0,13,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" Validation.Error="Validation_OnError">
<TextBox.Text>
<Binding Path="MyDate" StringFormat="HH:mm" NotifyOnValidationError="True" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<c:TimeValidator></c:TimeValidator>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
是否可以对属性更改进行验证,以及丢失焦点的转换?
我希望更改属性的验证,但我想让我的数据源更新失去焦点。否则,当用户在TextBox中编辑时,转换器将启动。如果值为10:50
并且用户删除了最后一个数字,那么这可能是一个问题,因此该值变为10:5
。转换器然后将其转换为10:50
。这对于失去焦点是可以的,但不会改变属性。但是为了验证器,我想验证属性更改,这样只要输入的值无效,用户就会有红色边框。
答案 0 :(得分:2)
是的!我只是在努力解决这个问题。 AFAIK,没有XAML组合 - 它必须在代码隐藏中完成,你需要直接引用该元素。
Element.GetBindingExpression(PropertyName).ValidateWithoutUpdate();
您可能想要检查GetBindingExpression是否不返回null;此将运行您附加的任何转换器(可能是为了将转换后的值提供给ValidationStep设置为ConvertedProposedValue的转换器),但不会更新源。而且,当然,你必须在某些情况下调用它,也许是TextChanged或者其他一些东西。以下是MSDN文档:https://msdn.microsoft.com/en-us/library/system.windows.data.bindingexpressionbase.validatewithoutupdate(v=vs.110).aspx
答案 1 :(得分:0)
使用此代码:
BindingExpression expression =
txtStudentName.GetBindingExpression(TextBox.TextProperty);
expression.ValidateWithoutUpdate();
如果要在检查后更新其源,请使用以下代码:
BindingExpression expression =
txtStudentName.GetBindingExpression(TextBox.TextProperty);
expression.ValidateWithoutUpdate();
if (expression!=null && !expression.HasError)
expression.UpdateSource();