2010-12-01 9 views
0

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?

Antwort

0

Wenn Sie die Ausnahme ignorieren und dabei helfen, Ihre aktuelle Implementierung zu umgehen, sollten Sie eine DataTemplateSelector verwenden. Hier ist eine sample, die auf einem ListBox stattfindet.

+0

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

0

OneWayToSource versucht, Ihre Bindungsdaten zu aktualisieren, was wahrscheinlich nicht möglich ist. OneWay-Bindung sollte gut funktionieren.

+0

Hi Grozz, Sie haben recht, dass aus irgendeinem Grund das DataTemplate auf diese Weise wechselt, verursacht ein Problem beim Aktualisieren der Quelle. Wenn ich versuche, TwoWay anstelle von OneWayToSource auf meinem TextBox-Ziel zu verwenden, funktioniert es jedoch einwandfrei. – Bill