Desidero copiare un'associazione, in questo modo posso impostare una diversa proprietà di origine su di essa senza influire sul binding originale. È solo un caso di impostare tutte le proprietà sul nuovo binding per essere uguali al vecchio?Binding non ha un metodo Clone, qual è un modo efficace per copiarlo
risposta
se non riesci a trovare un metodo per farlo, crea già un'espressione per Binding.
public static class BindingExtensions
{
public static Binding Clone(this Binding binding)
{
var cloned = new Binding();
//copy properties here
return cloned;
}
}
public void doWork()
{
Binding b= new Binding();
Binding nb = b.Clone();
}
Immagino di dover semplicemente copiare manualmente queste proprietà ... –
Qui è la mia soluzione al problema:
public static BindingBase CloneBinding(BindingBase bindingBase, object source)
{
var binding = bindingBase as Binding;
if (binding != null)
{
var result = new Binding
{
Source = source,
AsyncState = binding.AsyncState,
BindingGroupName = binding.BindingGroupName,
BindsDirectlyToSource = binding.BindsDirectlyToSource,
Converter = binding.Converter,
ConverterCulture = binding.ConverterCulture,
ConverterParameter = binding.ConverterParameter,
//ElementName = binding.ElementName,
FallbackValue = binding.FallbackValue,
IsAsync = binding.IsAsync,
Mode = binding.Mode,
NotifyOnSourceUpdated = binding.NotifyOnSourceUpdated,
NotifyOnTargetUpdated = binding.NotifyOnTargetUpdated,
NotifyOnValidationError = binding.NotifyOnValidationError,
Path = binding.Path,
//RelativeSource = binding.RelativeSource,
StringFormat = binding.StringFormat,
TargetNullValue = binding.TargetNullValue,
UpdateSourceExceptionFilter = binding.UpdateSourceExceptionFilter,
UpdateSourceTrigger = binding.UpdateSourceTrigger,
ValidatesOnDataErrors = binding.ValidatesOnDataErrors,
ValidatesOnExceptions = binding.ValidatesOnExceptions,
XPath = binding.XPath,
};
foreach (var validationRule in binding.ValidationRules)
{
result.ValidationRules.Add(validationRule);
}
return result;
}
var multiBinding = bindingBase as MultiBinding;
if (multiBinding != null)
{
var result = new MultiBinding
{
BindingGroupName = multiBinding.BindingGroupName,
Converter = multiBinding.Converter,
ConverterCulture = multiBinding.ConverterCulture,
ConverterParameter = multiBinding.ConverterParameter,
FallbackValue = multiBinding.FallbackValue,
Mode = multiBinding.Mode,
NotifyOnSourceUpdated = multiBinding.NotifyOnSourceUpdated,
NotifyOnTargetUpdated = multiBinding.NotifyOnTargetUpdated,
NotifyOnValidationError = multiBinding.NotifyOnValidationError,
StringFormat = multiBinding.StringFormat,
TargetNullValue = multiBinding.TargetNullValue,
UpdateSourceExceptionFilter = multiBinding.UpdateSourceExceptionFilter,
UpdateSourceTrigger = multiBinding.UpdateSourceTrigger,
ValidatesOnDataErrors = multiBinding.ValidatesOnDataErrors,
ValidatesOnExceptions = multiBinding.ValidatesOnDataErrors,
};
foreach (var validationRule in multiBinding.ValidationRules)
{
result.ValidationRules.Add(validationRule);
}
foreach (var childBinding in multiBinding.Bindings)
{
result.Bindings.Add(CloneBinding(childBinding, source));
}
return result;
}
var priorityBinding = bindingBase as PriorityBinding;
if (priorityBinding != null)
{
var result = new PriorityBinding
{
BindingGroupName = priorityBinding.BindingGroupName,
FallbackValue = priorityBinding.FallbackValue,
StringFormat = priorityBinding.StringFormat,
TargetNullValue = priorityBinding.TargetNullValue,
};
foreach (var childBinding in priorityBinding.Bindings)
{
result.Bindings.Add(CloneBinding(childBinding, source));
}
return result;
}
throw new NotSupportedException("Failed to clone binding");
}
Perché ElementName e RelativeSource sono commentati? Immagino che tu abbia riscontrato un problema durante il tentativo di clonare quelle proprietà? –
Il binding consente solo di impostare ElementName, RelativeSource o Source. Se si tenta di impostarne più di uno, viene generata un'eccezione InvalidOperationException. –
Si è verificato un problema nell'utilizzo di quanto sopra, ad eccezione del fatto che stavo copiando la sorgente dal vecchio binding al nuovo. Nel mio caso l'associazione eredita DataContext come sua fonte. Quando copio il codice sorgente, imposta in modo esplicito null come origine che apparentemente non utilizza DataContext. Per superare questo, utilizzare: 'Source = binding.Source ?? DependencyProperty.UnsetValue; – xr280xr
ho appena notato in BindingBase decompilato codice che ha un metodo interno Clone()
, quindi un altro (non sicuro, non provare a casa, l'uso a proprio rischio, ecc) soluzione sarebbe quella di utilizzare la reflection per bypassare le limitazioni di accesso del compilatore:
public static BindingBase CloneBinding(BindingBase bindingBase, BindingMode mode = BindingMode.Default)
{
var cloneMethodInfo = typeof(BindingBase).GetMethod("Clone", BindingFlags.Instance | BindingFlags.NonPublic);
return (BindingBase) cloneMethodInfo.Invoke(bindingBase, new object[] { mode });
}
non provate, però, quindi potrebbe non funzionare.
- 1. Java efficace: analisi del metodo clone()
- 2. Qual è un metodo efficace per attraversare verticalmente un array 2d per trovare in modo programmatico un set "vuoto"?
- 3. Unit Testing User Interface. Qual è un modo efficace?
- 4. Qual è un modo efficace per stabilire se una bitmap è completamente nera?
- 5. Qual è il modo più efficace per determinare se un grafico diretto è collegato singolarmente?
- 6. Creare un modo efficace per riassumere
- 7. Tronca un array senza copiarlo?
- 8. Qual è il modo più efficace per troncare un numero per una precisione specifica?
- 9. È un modo efficace e pignolo per vedere se un elemento in un iterabile è vero per un determinato attributo?
- 10. Java: il modo più efficace per copiare in modo difensivo un int []?
- 11. Un modo per determinare quale oggetto ha chiamato un metodo?
- 12. Il modo più efficace per correggere un JSON non valido
- 13. Data di costruzione - Un modo efficace
- 14. Qual è il modo più efficace per chiedere a un MethodInfo quanti parametri ci vuole?
- 15. Qual è un modo efficace per trovare elementi disgiunti in due array?
- 16. Qual è il modo migliore per vedere se un RadioButtonList ha un valore selezionato?
- 17. Qual è il modo più efficace per scorrere un elenco in python?
- 18. Qual è il modo più semplice ed efficace per creare un heap minimo in Scala?
- 19. Qual è il modo più efficace per trovare quali utenti hanno preferito un tweet specifico?
- 20. Qual è il modo più efficace per aggiungere uno std :: vector alla fine di un altro?
- 21. Qual è il modo più efficace per comprimere due lista annidata ad un unico dizionario livello
- 22. Qual è un buon metodo per * temporaneamente * ordinare un vettore?
- 23. WPF Trigger Binding: qual è il modo migliore per associare un valore enum alla visiblity?
- 24. Miglior metodo di selezione della casella per un clone Minecraft
- 25. Qual è il modo più efficace per rappresentare i valori algebrici di tipo finito (non ricorsivo)?
- 26. Un modo efficace per indicare più variabili indicatore per riga?
- 27. Perché ObservableCollection non ha un metodo RemoveAll?
- 28. Qual è un modo efficace per concatenare tutte le stringhe in un array, separandole con uno spazio?
- 29. AtomicBoolean non ha un metodo negate()?
- 30. Qual è il modo migliore per chiamare correttamente un metodo DOPO il caricamento di un modulo?
Ora ho trovato che non è necessario copiare un'associazione, nel codice posso utilizzare un'associazione più di una volta su diversi elementi. –