我已经生成了一个CustomControl,其中包含一个TextBox(以及其他元素)。绑定值有效:
(Generic.xaml的Code-Snippet)
<TextBox Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ParameterValue, Mode=TwoWay }"/>
现在,我想在我的Binding中添加一些ValueConverter,所以我实现了ParameterConverter
。使用转换器工作也(到目前为止),我可以看到正在转换的值。
<TextBox Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ParameterValue, Mode=TwoWay, Converter={StaticResource ParameterConverter}}"/>
现在我的转换器逻辑变得更复杂,我想在我的parameter
上使用ParameterConverter
属性。但不幸的是,由于parameter
不是DependencyProperty
,我无法绑定它。我在CustomControl中注册了一些DependencyProperty,但我无法将其绑定到我的XAML中的ConverterParameter
。我想要绑定的所需ConverterParameter是一个名为ParameterUnit
的枚举。
我期望结果应该是这样的:
<TextBox Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ParameterValue, Mode=TwoWay, Converter={StaticResource ParameterConverter}, ConverterParameter='{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ParameterUnit}'}"/>
我有一个解决方案,但看起来非常讨厌,并且违反了我希望尽可能遵循的CCD原则。我在ParameterControl
- 类:
public ParameterControl()
{
_textBox = (TextBox)Template.FindName("ParameterValueTextBox", this);
this.Loaded += (s, e) => SetupControl();
}
public void SetupControl()
{
var textBinding = new Binding();
textBinding.RelativeSource = RelativeSource.TemplatedParent;
textBinding.Path = new PropertyPath("ParameterValue");
textBinding.Converter = new ParameterToHumanFormatConverter();
textBinding.ConverterParameter = ParameterUnit;
textBinding.Mode = BindingMode.TwoWay;
textBinding.UpdateSourceTrigger = UpdateSourceTrigger.LostFocus;
_textBox.SetBinding(TextBox.TextProperty, textBinding);
}
难道没有更好,更清洁,更简单的解决方案吗?我简直无法相信没有办法绑定ConverterParameter
。