Wenn Sie ein DataTemplate für ein ListBox-Element verwenden, reagiert meine Anwendung und löst eine Ausnahme im Ausgabefenster aus. Die Details folgen.Bindungsmodus für Element in Listbox
Vorlage bearbeiten:
<DataTemplate x:Key="EditOnlyTemplate">
<Border BorderBrush="Blue" Margin="3" Padding="3" BorderThickness="2" CornerRadius="5" Background="Beige">
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Vertical" VerticalAlignment="Center">
<TextBox Width="300" FontSize="25" Foreground="Goldenrod" Text="{Binding XPath=/doc/dob/text, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged, diag:PresentationTraceSources.TraceLevel=High}" />
<TextBox Width="300" FontSize="25" Foreground="Blue" Text="{Binding XPath=/doc/dob/group, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Width="300" FontSize="25" Foreground="Green" Text="{Binding XPath=/doc/dob/filter, UpdateSourceTrigger=PropertyChanged}" />
<Button Content="Save" Click="btnSave_Click" Width="40" HorizontalAlignment="Left" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentControl}}}"/>
</StackPanel>
</StackPanel>
</Border>
</DataTemplate>
ich den folgenden Code verwenden hinter einem Button-Klick zu handhaben und schale meine Datatemplate auf meinem ListBox Item von einem, die einfach zeigt die gebundenen Daten (dh „Details“ Vorlage) zu einem, wo ich die gebundenen Daten ändern kann (zB "Edit" Template).
private void btnEdit_Click(object sender, RoutedEventArgs e)
{
Button btn = (Button)sender;
//command contains the list item
ContentControl itm = (ContentControl)btn.CommandParameter;
itm.ContentTemplate = this.FindResource("EditTemplate") as DataTemplate;
}
Die Sache über meine EditTemplate zu beachten ist der Bindungsmodus der ersten TextBox - es ist auf OneWayToSource. Dies verursacht das Problem, wenn ich auf die Schaltfläche "Bearbeiten" klicke, die diese Vorlage eintauscht. Wenn ich den Modus auf "TwoWay" (der Standardmodus für die TextBox) ändere, gibt es kein Problem. Wenn ich eine Kopie dieser Vorlage an einer anderen Stelle auf der Seite verwende, die während des Entwurfs eingefügt wurde - nicht über Code - und nicht in einem ListBox-Objekt, sondern in einem ContentControl, funktioniert der OneWayToSource-Modus wie erwartet.
Die in meinem gebrochenen Szenario geworfen Ausnahme ist folgende:
System.Windows.Data Warning: 104 : BindingExpression (hash=48690759): At level 0 - for XmlElement.InnerText found accessor ReflectPropertyDescriptor(InnerText)
System.Windows.Data Warning: 100 : BindingExpression (hash=48690759): Replace item at level 0 with XmlElement (hash=21889970), using accessor ReflectPropertyDescriptor(InnerText)
System.Windows.Data Warning: 86 : BindingExpression (hash=48690759): Update - got raw value ''
System.Windows.Data Warning: 90 : BindingExpression (hash=48690759): Update - using final value ''
System.Wi
ndows.Data Warning: 98 : BindingExpression (hash=48690759): SetValue at level 0 to XmlElement (hash=21889970) using ReflectPropertyDescriptor(InnerText): ''
A first chance exception of type 'System.InvalidOperationException' occurred in WindowsBase.dll
System.Windows.Data Error: 8 : Cannot save value from target back to source. BindingExpression:Path=/InnerText; DataItem='XmlDocument' (HashCode=33583636); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String') InvalidOperationException:'System.InvalidOperationException: Dispatcher processing has been suspended, but messages are still being processed.
at System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object component, Object value)
at MS.Internal.Data.PropertyPathWorker.SetValue(Object item, Object value)
at MS.Internal.Data.ClrBindingWorker.UpdateValue(Object value)
at System.Windows.Data.BindingExpression.UpdateSource(Object value)'
ich die ListBox vermuten ist irgendwie die Ursache, sondern kann nicht verstehen, warum, bis auf mögliche Fehler. Ich verwende das .Net Framework 3.5 mit allen aktuellen Updates unter Windows XP. Sieht jemand offensichtlich etwas falsch mit dem, was ich versuche zu tun?
Hallo Aaron, Danke für den Tipp. Ich werde sicherlich den DataTemplateSelector in Zukunft verwenden, aber ich bin nicht klar, wie es dieses verbindliche Problem beeinflussen wird, das ich sehe. Es scheint mir die beabsichtigte Verwendung von DataTemplateSelector ist für die Anzeige verschiedener Arten von Elementen in der ListBox, während ich versuche, einen anderen "Modus" der Verwendung für die gebundenen Daten zu implementieren. Ich werde es jedoch versuchen. – Bill