यहां कुछ शानदार उत्तर दिए गए हैं। बहुत उपयोगी। मैंने बाध्यकारी जानकारी की प्रतिलिपि बनाने के लिए विभिन्न दृष्टिकोणों की कोशिश की थी, जिसमें http://pjlcon.wordpress.com/2011/01/14/change-a-wpf-binding-from-sync-to-async-programatically/ में उल्लिखित दृष्टिकोण शामिल है लेकिन यहां की जानकारी इंटरनेट पर सबसे अच्छी है!
मैं InvalidOperationException के साथ काम कर "बाइंडिंग बदला नहीं जा सकता यह प्रयोग किया गया है के बाद।" मेरे परिदृश्य में, मैं बनाए रखने गया था कुछ कोड किसी ने लिखा है के लिए एक फिर से प्रयोग करने योग्य विस्तार विधि बनाया है, और एक प्रमुख DevExpress DXGrid ढांचे अपग्रेड करने के बाद, यह अब काम नहीं किया निम्नलिखित ने मेरी समस्या को पूरी तरह से हल किया। कोड का हिस्सा जहां मैं ऑब्जेक्ट वापस करता हूं, अच्छा हो सकता है, और मैं बाद में फिर से कारक बनाउंगा।
/// <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.");
}
}
}
स्रोत
2013-02-06 22:54:28
ध्यान रखें कि यह भी नाम है जो यूआई तत्वों के लिए उनके उपयोग करते हुए पेचीदा हो अगर वे रखा जाना एक ही रूट कंटेनर है क्लोन। – toad
मुझे नहीं लगता कि यह एनिमेशन को संरक्षित करता है, है ना? –
स्पष्ट होने के लिए, यह केवल आधा समाधान है (क्योंकि यह 08 में वापस खड़ा था)। इससे बाइंडिंग का मूल्यांकन किया जाएगा और परिणाम क्रमबद्ध किए जाएंगे। अगर आप बाइंडिंग को संरक्षित करना चाहते हैं (प्रश्न के रूप में पूछा गया) आपको या तो रनटाइम पर बाध्यकारी प्रकार में एक अभिव्यक्ति कनवर्टर जोड़ना होगा (प्रासंगिक लिंक के लिए मेरे प्रश्न का दूसरा भाग देखें) या 4.0 में इसे कैसे करें इसके लिए नीचे अपना स्वयं का उत्तर देखें। – Will