使用IMultiValueConverter绑定TextBox Text时可否保留额外绑定参数?
问题解答
完全可以正常指定NotifyOnValidationError、UpdateSourceTrigger这类绑定参数,使用MultiValueConverter不会对这些配置造成限制。
这类参数属于绑定全局配置属性,直接写在MultiBinding节点上即可生效,和你之前写在单值绑定{Binding}内的效果完全一致,仅需要把原有的单值绑定改为多绑定结构即可,示例如下:
XAML代码示例
<TextBox> <TextBox.Text> <MultiBinding Converter="{StaticResource DynamicStringFormatConverter}" NotifyOnValidationError="True" UpdateSourceTrigger="PropertyChanged" NotifyOnSourceUpdated="True"> <!-- 第一个绑定为原始数值属性 --> <Binding Path="Scale" /> <!-- 第二个绑定为动态的格式字符串属性,可从ViewModel动态获取 --> <Binding Path="DisplayFormat" /> </MultiBinding> </TextBox.Text> </TextBox>
对应MultiValueConverter实现示例
public class DynamicStringFormatConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { // 入参校验 if (values.Length < 2 || values[0] == DependencyProperty.UnsetValue || values[1] is not string format) { return DependencyProperty.UnsetValue; } // 按传入的格式字符串格式化数值 return string.Format(culture, format, values[0]); } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { // 反向转换:把输入的字符串解析为数值回写Scale属性 if (value is not string input || string.IsNullOrWhiteSpace(input)) { return new object[] { 0d, Binding.DoNothing }; } if (double.TryParse(input, out var scaleValue)) { // 格式字符串属性不需要回写,返回Binding.DoNothing即可 return new object[] { scaleValue, Binding.DoNothing }; } return new object[] { DependencyProperty.UnsetValue, Binding.DoNothing }; } }
补充说明
- 仅单个数据源的专属配置(比如
Path、ElementName、Source等)需要写在MultiBinding内部的<Binding>子节点中 - 所有单值绑定支持的全局配置,包括各类校验通知开关、
UpdateSourceTrigger、ValidatesOnDataErrors等属性,都可以直接在MultiBinding节点上声明使用。
内容的提问来源于stack exchange,提问作者Andrew Stephens
相关产品推荐
相关产品推荐

