Как передать CommandParameter с помощью Binding через XAML в пользовательских элементах управления - PullRequest
0 голосов
/ 02 декабря 2011

Я создал CustomControl, который включает (среди других элементов) TextBox. Привязка значения работает:

(фрагмент кода из Generic.xaml)

<TextBox Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ParameterValue, Mode=TwoWay }"/>

Теперь я хотел добавить ValueConverter к своему Binding, поэтому я реализовал ParameterConverter. Использование конвертера работает также (пока), я вижу конвертируемое значение.

<TextBox Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ParameterValue, Mode=TwoWay, Converter={StaticResource ParameterConverter}}"/>

Теперь, когда моя логика преобразователей стала более сложной, я захотел использовать свойство parameter на моем ParameterConverter. Но, к сожалению, поскольку parameter не является DependencyProperty, я не могу ничего с ним связать. Я зарегистрировал некоторое свойство DependencyProperty в своем CustomControl, но не смог связать его с ConverterParameter в моем XAML. Требуемый параметр ConverterParameter, к которому я хочу привязать, - это Enum с именем 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 Ответ

1 голос
/ 02 декабря 2011

Если вам нужно более одного связывания значения, просто используйте MultiBinding.

...