Как связать данные двух элементов пользовательского интерфейса, чтобы они могли немедленно обновлять друг друга в Silverlight? - PullRequest
3 голосов
/ 30 августа 2009

Предположим, я хочу привязать данные к двум TextBox. Я могу сделать это в XAML:

<TextBox x:Name="FirstBox" Text="{Binding Text, Mode=TwoWay, ElementName= SecondBox}"></TextBox>
<TextBox x:Name="SecondBox"></TextBox>

Или я могу сделать это программно.

    Binding binding = new Binding("Text");
    binding.Mode = BindingMode.TwoWay;
    binding.Source = SecondBox;
    FirstBox.SetBinding(TextBox.TextProperty, binding);

Проблема в том, что когда я набираю что-то в SecondBox, оно сразу же отражается в FirstBox. Тем не менее, ввод в FirstBox не отображается сразу во SecondBox. SecondBox обновляется только при фокусировке FirstBox.

Конечно, я могу создать еще одну привязку для SecondBox. Но есть ли другой способ внести изменения в FirstBox, чтобы немедленно обновить SecondBox?

Ответы [ 3 ]

3 голосов
/ 30 августа 2009

Возможно, есть и другие способы, включающие куски кода, но я не могу придумать способ более легкий , если вы действительно об этом спрашиваете. Почему бы вам не использовать другую привязку на SecondBox для просмотра первой (я предполагаю, что это является некоторым упрощением сценария, в котором выполнение всего этого имеет смысл)?

2 голосов
/ 01 сентября 2009

Вы можете достичь этого с небольшим количеством кода. Xaml выглядит так:

<TextBox x:Name="tb1" Text="{Binding Path=Text, ElementName=tb2, Mode=TwoWay, UpdateSourceTrigger=Explicit}" TextChanged="tb1_TextChanged" />
<TextBox x:Name="tb2" />

Это то же самое, что и у вас, за исключением того, что мы устанавливаем «UpdateSourceTrigger = Explicit» и регистрируемся для события TextChanged. По умолчанию привязки в TextBox.Text обновляются, когда TextBox теряет фокус. Устанавливая «UpdateSourceTrigger = Explicit», мы переопределяем поведение обновления по умолчанию, и нам нужно явно указать, когда обновлять привязки. Итак, у нас есть обработчик события TextChanged, который выглядит следующим образом:

private void tb1_TextChanged(object sender, TextChangedEventArgs e)
{
    tb1.GetBindingExpression(TextBox.TextProperty).UpdateSource();
}
1 голос
/ 31 августа 2009

Я думаю, что это ожидаемое поведение для TextBox. От http://msdn.microsoft.com/en-us/library/cc278072(VS.95).aspx

Обновление источника данных В привязках TwoWay изменения к цели автоматически обновляют источник , за исключением случаев, когда выполняется привязка к свойству Text TextBox. В этом случае обновление происходит, когда TextBox теряет фокус .

Я думаю, вам нужно также связать свойство Text во втором TextBox, чтобы получить поведение, которое вы хотите, как предложил Энтони.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...