我设置了一个数据绑定,它使用转换器将笨拙的 XML 源转换为便于显示和编辑的内部类树。一切都非常适合从 XML 源读取,但我有一段时间试图对内部类进行更改以传播回 XML 源。
这是使用站点的 XAML:
<local:SampleConverter x:Key="SampleConverter" />
<Expander Header="Sample" >
<local:SampleControl
Sample="{Binding Path=XmlSource,
Converter={StaticResource SampleConverter},
Mode=TwoWay}" />
</Expander>
XmlSource 是父数据绑定对象的 CLR 读写属性(不是 DependencyProperty)。它是从 XSD 生成的 .NET 类型。
SampleConverter 实现IValueConverter
. 该Convert
方法被调用并返回非空数据,但该ConvertBack
方法从未被调用。
SampleControl 是一个 UserControl,它封装了与 Sample 数据树的 UI 交互。它的 XAML 看起来像这样:
<UserControl x:Class="SampleControl">
[... other stuff ...]
<UserControl.Content>
<Binding Path="Sample" RelativeSource="{RelativeSource Mode=Self}" Mode="TwoWay" TargetNullValue="{StaticResource EmptySampleText}" />
</UserControl.Content>
<UserControl.ContentTemplateSelector>
<local:BoxedItemTemplateSelector />
</UserControl.ContentTemplateSelector>
</UserControl>
Sample 属性是后面 SampleControl 代码中的一个 DependencyProperty:
public static readonly DependencyProperty SampleProperty =
DependencyProperty.Register("Sample", typeof(SampleType), typeof(SampleControl), new PropertyMetadata(new PropertyChangedCallback(OnSampleChanged)));
public SampleType Sample
{
get { return (SampleType)GetValue(SampleProperty); }
set { SetValue(SampleProperty, value); }
}
private static void OnSampleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != null)
{
((INotifyPropertyChanged)e.NewValue).PropertyChanged += ((SampleControl)d).MyPropertyChanged;
}
else if (e.OldValue != null)
{
((INotifyPropertyChanged)e.OldValue).PropertyChanged -= ((SampleControl)d).MyPropertyChanged;
}
}
private void MyPropertyChanged(object sender, PropertyChangedEventArgs e)
{
; // breakpoint here shows change notices are happening
}
XmlSource 被转换以实现 INotifyPropertyChanged 的内部类,并正在向上发送更改通知树,如上面 MyPropertyChanged 中的断点所示。
因此,如果数据报告它已更改,为什么 WPF 不调用我的转换器的 ConvertBack 方法?