여기에 몇 가지 좋은 답변이 있습니다. 매우 도움이됩니다. http://pjlcon.wordpress.com/2011/01/14/change-a-wpf-binding-from-sync-to-async-programatically/에 설명 된 접근 방법을 포함하여 바인딩 정보를 복사하기위한 다양한 접근법을 시도했지만 여기 정보는 인터넷에서 최고입니다!
"사용 후 바인딩을 변경할 수 없습니다."라고 생각하는 InvalidOperationException을 처리 할 수있는 재사용 확장 메서드를 만들었습니다. 제 시나리오에서는 누군가가 작성한 코드를 유지 관리하고 DevExpress DXGrid 프레임 워크를 업그레이드 한 후 더 이상 일하지 않았다. 다음은 내 문제를 완벽하게 해결했습니다. 객체를 반환하는 코드 부분이 더 좋을 수 있으며 나중에 다시 생각할 것입니다. 그것은 또한 그들이 동일한 루트 컨테이너가 배치 될 경우 자신의 UI 요소에 사용 복잡하게 이름을 클론 마음에
/// <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.");
}
}
}
하십시오. – toad
나는 생각하지 않는다 –
분명히 말해서, 이것은 솔루션의 절반에 지나지 않습니다 (08로 되돌아갔습니다). 그러면 바인딩이 평가되고 결과가 직렬화됩니다. 바인딩을 유지하려는 경우 (질문으로 질문) 당신은 런타임에 바인딩 유형에 ExpressionConverter를 추가하거나 (해당 링크에 대한 내 질문의 두 번째 부분을 참조) 또는 4.0에서 수행하는 방법에 대한 내 자신의 대답을 참조하십시오. – Will