我希望复制一个绑定,这是因为我可以在其上设置不同的源属性而不影响原始绑定。这只是将新绑定的所有属性设置为与旧相同的情况?绑定没有克隆方法,什么是复制它的有效方法
回答
如果你找不到一个方法来做到这一点,已经为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