Aquí hay algunas buenas respuestas. Muy útil. He intentado varios métodos para copiar información de enlace, incluido el enfoque descrito en http://pjlcon.wordpress.com/2011/01/14/change-a-wpf-binding-from-sync-to-async-programatically/, pero la información aquí es la mejor en Internet.
Creé un método de extensión reutilizable para tratar con InvalidOperationException "El enlace no se puede cambiar después de que se haya utilizado." En mi caso, mantenía algún código que alguien escribió, y después de una importante actualización del framework DevExpress DXGrid, ya no funcionó. Lo siguiente resolvió mi problema perfectamente. La parte del código donde devuelvo el objeto podría ser más agradable, y lo volveré a factorizar más adelante.
/// <summary>
/// Extension methods for the WPF Binding class.
/// </summary>
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.");
}
}
}
Tenga en cuenta que también clona el nombre que complica su uso para la interfaz de usuario Elementos si han de ser colocados es el mismo contenedor raíz. – toad
No creo esto preserva las animaciones, ¿o sí? –
Para ser claros, esto es solo la mitad de la solución (como quedó atrás en 08). Esto causará que los enlaces sean evaluados y los resultados sean serializados. Si desea preservar los enlaces (como la pregunta preguntado) usted debe agregar un ExpressionConverter al tipo de enlace en tiempo de ejecución (vea la segunda parte de mi pregunta para el enlace relevante) o vea mi propia respuesta a continuación para saber cómo hacerlo en 4.0. – Will