MM们
这里有一些很好的答案。很有帮助。我尝试了多种方法来复制绑定信息,包括http://pjlcon.wordpress.com/2011/01/14/change-a-wpf-binding-from-sync-to-async-programatically/中概述的方法,但是这里的信息是Internet上最好的!我创建了一个可重复使用的扩展方法来处理InvalidOperationException“绑定已使用后无法更改。”在我的场景中,我维护着某些人编写的代码,并且在DevExpress DXGrid框架进行了重大升级之后,它不再起作用。以下完美解决了我的问题。我返回对象的代码部分可能会更好,稍后我将对其进行重构。/// /// Extension methods for the WPF Binding class./// 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); // HERE BE MAGIC!!! mgr.XamlWriterMode = XamlWriterMode.Expression; // THERE WERE MAGIC!!! 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 could not be cloned via Xaml Serialization Stack."); } 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 could not be cast."); } }}