我有一個數據綁定設置與轉換器將一個尷尬的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>
樣品屬性在後面的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方法?
屬性更改您的代碼示例僅表示該樣品的特性正在發生變化,而不是樣品本身。 – Ragepotato 2011-06-15 20:52:30
@Ragepotato:你是說數據綁定只適用於新實例分配給Sample屬性,但如果Sample屬性引用的現有實例的屬性發生更改並通過INotifyPropertyChanged發信號通知它們,則不適用? – dthorpe 2011-06-15 21:20:41
是的。該示例從未改變。它是同一個對象。它內的屬性已更改。 你可以測試這個。在加載完所有內容後,將一個按鈕放在控件上,Sample從虛擬機獲取它的初始分配。然後將Sample指定給新的SampleType。記住它必須是正確的類型,否則綁定引擎會忽略它。如果你設置好雙向綁定,你會看到你的轉換被調用。 – Ragepotato 2011-06-16 05:56:14