我希望複製一個綁定,這是因爲我可以在其上設置不同的源屬性而不影響原始綁定。這只是將新綁定的所有屬性設置爲與舊相同的情況?綁定沒有克隆方法,什麼是複製它的有效方法
回答
如果你找不到一個方法來做到這一點,已經爲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();
}
我想我只需要手動複製這些屬性然後... – 2010-01-13 00:43:55
這裏是我的問題的解決方案:
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");
}
爲什麼ElementName和RelativeSource被註釋掉了?我猜你在克隆這些屬性時遇到了問題? – 2011-03-02 15:17:51
綁定僅允許您設置ElementName,RelativeSource或Source之一。如果您嘗試設置多個,則會引發InvalidOperationException。 – 2011-04-04 14:25:17
我在使用上述時遇到了問題,除了我將源代碼從舊的綁定複製到新的。在我的情況下,綁定繼承DataContext作爲其源。當我複製源時,它明確地將null設置爲顯然不會使用DataContext的源。要解決這個問題,請使用:'Source = binding.Source ?? DependencyProperty.UnsetValue; – xr280xr 2012-03-22 15:18:14
我只注意到在BindingBase反編譯,它有一個內部Clone()
方法的代碼,所以其他(不安全的,不要在家裏嘗試,使用在你自己的風險等)的解決方案是使用反射來繞過編譯器的訪問限制:
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 });
}
沒有嘗試,雖然如此,它可能無法正常工作。
- 1. 什麼是複製/克隆JSON對象結構的最有效方法?
- 2. 複製/克隆畫筆的最佳方法是什麼?
- 3. 將UniDataSet複製到SQL Server的最有效方法是什麼?
- 4. Sitecore - 有沒有在用戶管理器中克隆/複製用戶的方法?
- 5. 克隆方法
- 6. 複製和克隆有什麼區別?
- 7. onDeviceReady(){...}沒有方法'綁定'
- 8. 有沒有簡單的方法從GitHub克隆所有Starred Repos?
- 9. 什麼是包含沒有src的圖像的有效方法?
- 10. 克隆/複製knockoutJS中的observablearray的最佳方式是什麼?
- 11. WPF有沒有辦法在c#(克隆)中複製MediaElement
- 12. 有沒有更好的方法來迭代克隆N元樹?
- 13. 有沒有簡單的方法來克隆字符串數組?
- 14. 列表有沒有更好的深層克隆方法?
- 15. 寫出工廠方法最有效的方法是什麼?
- 16. Threejs克隆方法
- 17. 有效的Java:克隆()方法的分析
- 18. 複製沒有克隆的跨度?
- 19. 保持表格行克隆的有效方法
- 20. 什麼是方法的綁定?
- 21. 有什麼方法可以定製TDBadgedCell
- 22. 克隆Web服務的最簡單方法是什麼?
- 23. 克隆SVGMatrix的規範方法是什麼?
- 24. 在Jung中克隆圖形的最佳方法是什麼?
- 25. 克隆observables的最佳方法是什麼?
- 26. 幾次克隆對象的最快方法是什麼
- 27. 從github克隆後安裝rails的正確方法是什麼?
- 28. 在WPF中克隆TabItem的最簡單方法是什麼?
- 29. jsPlumb-沒有複製拖動克隆
- 30. Git克隆掛起 - 有沒有辦法繼續克隆?
我現在發現我不需要複製綁定,在代碼中,我可以在不同的元素上多次使用綁定。 – 2011-06-15 02:06:29