Es gibt hier einige großartige Antworten. Sehr hilfreich. Ich hatte verschiedene Ansätze zum Kopieren von Binding-Informationen ausprobiert, einschließlich des im http://pjlcon.wordpress.com/2011/01/14/change-a-wpf-binding-from-sync-to-async-programatically/ skizzierten Ansatzes, aber die Informationen hier sind die besten im Internet!
Ich habe eine wiederverwendbare Erweiterungsmethode erstellt, um mit der InvalidOperationException "Binding kann nach Verwendung nicht geändert werden" umzugehen. In meinem Szenario habe ich den Code von jemandem gewartet, und nach einem großen Upgrade des DevExpress DXGrid-Frameworks hat es nicht mehr funktioniert. Das Folgende hat mein Problem perfekt gelöst. Der Teil des Codes, in dem ich das Objekt zurückgebe, könnte besser sein, und ich werde das später refaktorisieren.
///
/// Erweiterungsmethoden für die WPF-Binding-Klasse.
///
public static class BindingExtensions
{
public static BindingBase CloneViaXamlSerialization(this BindingBase binding)
{
var sb = new StringBuilder();
var writer = XmlWriter.Create(sb, new XmlWriterSettings
{
Indent = true,
ConformanceLevel = ConformanceLevel.Fragment,
OmitXmlDeclaration = true,
NamespaceHandling = NamespaceHandling.OmitDuplicates,
});
var mgr = new XamlDesignerSerializationManager(writer);
// HIER LIEGT DER ZAUBER!!!
mgr.XamlWriterMode = XamlWriterMode.Expression;
// DA WAR DER ZAUBER!!!
System.Windows.Markup.XamlWriter.Save(binding, mgr);
StringReader stringReader = new StringReader(sb.ToString());
XmlReader xmlReader = XmlReader.Create(stringReader);
object newBinding = (object)XamlReader.Load(xmlReader);
if (newBinding == null)
{
throw new ArgumentNullException("Binding konnte nicht über die Xaml-Serialisierungsstack geklont werden.");
}
if (newBinding is Binding)
{
return (Binding)newBinding;
}
else if (newBinding is MultiBinding)
{
return (MultiBinding)newBinding;
}
else if (newBinding is PriorityBinding)
{
return (PriorityBinding)newBinding;
}
else
{
throw new InvalidOperationException("Binding konnte nicht umgewandelt werden.");
}
}
}