При отладке проблемы в приложении 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 поведение изменилось (как описано выше).