如何通过在自定义控件上通过XAML绑定来传递CommandParameter

时间:2011-12-02 07:54:15

标签: wpf xaml data-binding custom-controls ivalueconverter

我已经生成了一个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

1 个答案:

答案 0 :(得分:1)

如果您需要多个值绑定,请使用MultiBinding