厄介な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
メソッドが呼び出され、null以外のデータが返されますが、メソッドConvertBack
が呼び出されることはありません。
SampleControlは、サンプルデータツリーとのUIインタラクションをカプセル化するUserControlです。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メソッドを呼び出さないのはなぜですか?