Как получить симметричную привязку TwoWay? - PullRequest
0 голосов
/ 23 марта 2012

При отладке проблемы в приложении WPF я заметил, что привязка данных TwoWay не выглядит симметричной.Вот пример:

<Window x:Class="ConverterTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:local="clr-namespace:ConverterTest"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:TextConverter x:Key="textConverter"/>
    </Window.Resources>
    <Grid>
        <TextBox x:Name="txt1" Height="24" Margin="0" VerticalAlignment="Top"/>
        <TextBox x:Name="txt2" Height="24" Margin="0,40,0,0"  VerticalAlignment="Top"
                 Text="{Binding ElementName=txt1, Path=Text, 
                        Mode=TwoWay,
                        UpdateSourceTrigger=PropertyChanged, 
                        Converter={StaticResource textConverter}}"/>
    </Grid>
</Window>

Конвертер выглядит так:

public class TextConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, System.Type targetType,
         object parameter, System.Globalization.CultureInfo culture)
    {
        return value.ToString().ToUpper();
    }

    public object ConvertBack(object value, System.Type targetType, 
         object parameter, System.Globalization.CultureInfo culture)
    {
        return value.ToString().ToLower();
    }

    #endregion
}

При редактировании внутри txt1 вызывается только Convert();но при редактировании внутри txt2 сначала вызывается ConvertBack(), а затем Convert().

Другими словами, TwoWay привязка выглядит так:

  • Когдасвойство источника обновляется, свойство цели обновляется.
  • Когда свойство цели обновляется, сначала обновляется свойство источника, а затем свойство цели снова обновляется.

Документация MSDN просто говорит:

Вызывает изменения либо в свойстве source, либо в свойстве target для автоматического обновления другого.

Из этого предложения, Я ожидал бы следующее поведение:

  • Когда свойство источника обновляется, свойство цели обновляется.
  • Когда свойство целевого объекта обновляется, свойство источника обновляется.

Есть ли способ добиться этого симметричного поведения (чисто в XAML, без программирования на C #)?

EDIT : я только что обнаружил, что в WPF 3.5TwoWay корзинаДинги работают симметрично.Однако в WPF 4.0 поведение изменилось (как описано выше).

1 Ответ

2 голосов
/ 23 марта 2012

Ну, полностью симметричный не может быть достигнут, потому что:

  • Когда источник обновляется, элемент управления просто должен показать новое значение, период.Ничего необычного не происходит.
  • Когда цель обновляется, прежде чем она будет записана в источник, изменение значения может быть отменено в смешном количестве мест.

Например: проверка.

Когда источник обновляется, скажем, из кода, он проходит всю проверку (если вы не забыли проверить, но это еще одна проблема).Элемент управления просто отображает новое значение.

Когда цель обновляется, значение сначала преобразуется обратно в преобразователь для манипулирования, затем принудительно проверяется, проверяется и, наконец, устанавливается источник.

Но, как вы видите, значение могло быть изменено между целью и источником, поэтому значение снова преобразуется и, наконец, отображается.

Бонус: чтобы понять, где и в каком порядке значение можетсм. Значение свойства зависимости Приоритет .

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