Привязка значения ползунка к текстовому полю

Я хотел бы динамически создать слайдер с привязкой его значения к TextBox внутри DockPanel. Когда я пытаюсь это сделать, я не могу привязать значение ползунка к TextBox, а внутри TextBox я получаю следующее сообщение: {Binding ElementName = slValue, Path = Value, UpdateSourceTrigger = PropertyChanged} вместо значения ползунка.

Вот код, который я написал до сих пор:

double minimum = 0.0;
double maximum = 100.0;
double defaultValue = 5.0;
DockPanel item = new DockPanel();
item.VerticalAlignment = VerticalAlignment.Center;
Slider slValue = new Slider()
{
     Minimum = minimum,
     Maximum = maximum,
     TickFrequency = 1.0,
     Value = defaultValue,
     IsSnapToTickEnabled = true,
     Name = "slValue",
     Width = 100
};
TextBox slValueTB = new TextBox()
{
     Text = "{Binding ElementName=slValue, Path=Value, UpdateSourceTrigger=PropertyChanged}",
     TextAlignment = TextAlignment.Right,
     Width = 40,
};
item.Children.Add(slValue);
item.Children.Add(slValueTB);

А вот xml-код, который я пытаюсь воссоздать динамически:

        <DockPanel VerticalAlignment="Center" Margin="10">
            <TextBox Text="{Binding ElementName=slValue, Path=Value, UpdateSourceTrigger=PropertyChanged}" DockPanel.Dock="Right" TextAlignment="Right" Width="40" />
            <Slider Minimum="0" Maximum="100" TickPlacement="BottomRight" TickFrequency="5" IsSnapToTickEnabled="True" Name="slValue" />
        </DockPanel>

person user3154369    schedule 24.07.2014    source источник
comment
{Binding ...} - это расширение разметки, которое работает только в XAML, а не в программном коде. См. Как создать привязку в коде.   -  person Clemens    schedule 24.07.2014
comment
Я пробовал сделать это так же, как в примере выше, но все еще не могу привязать его значение к TextBox. Вот что мне удалось сделать до сих пор: Binding myBinding = new Binding (ValueChanged); myBinding.Source = slValue.Value; slValueTB.SetBinding (TextBox.TextProperty, myBinding);   -  person user3154369    schedule 24.07.2014
comment
Если вы хотите написать такой код, вы делаете что-то в корне неправильно, а именно не используете шаблоны данных.   -  person H.B.    schedule 24.07.2014


Ответы (2)


Это должно работать так:

var b = new Binding();
b.Source = slValue;
b.Path = new PropertyPath("Value");
slValueTB.SetBinding(TextBox.TextProperty, b);

или короче:

slValueTB.SetBinding(TextBox.TextProperty,
    new Binding
    {
        Source = slValue,
        Path = new PropertyPath("Value")
    });

или даже короче:

slValueTB.SetBinding(TextBox.TextProperty,
    new Binding("Value") { Source = slValue });
person Clemens    schedule 24.07.2014

Вот отрывок, как установить привязку в коде позади. Надеюсь, это поможет вам:

var b = new Binding();
b.Source = slValue;
b.Path = new PropertyPath("Value");
b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
slValueTB.SetBinding(TextBox.TextProperty, b);

Примечание: использование ElementName требует, чтобы имя было уникальным.

Изменить: ваш путь в Binding-конструкторе ("ValueChanged") вашего комментария выглядит немного странно. Вы пробовали вместо этого "Ценность"? И Source-Property должен быть контролем.

person Markus    schedule 24.07.2014
comment
смотри мое обновление. Но это указывает на то же, что Клеменс написал немного позже. - person Markus; 24.07.2014
comment
Я пробовал, но все еще не работает: /. Тем не менее, спасибо за вашу помощь. - person user3154369; 24.07.2014