Tôi muốn sao chép một ràng buộc, điều này là để tôi có thể đặt thuộc tính nguồn khác trên đó mà không ảnh hưởng đến ràng buộc ban đầu. Đây có phải chỉ là một trường hợp thiết lập tất cả các thuộc tính trên ràng buộc mới giống như cũ không?Ràng buộc không có phương pháp Clone, cách hiệu quả để sao chép nó
Trả lời
nếu bạn không thể tìm thấy phương pháp để thực hiện việc này, hãy tạo một exetension cho 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();
}
tôi đoán tôi chỉ cần sao chép các thuộc tính đó theo cách thủ công rồi ... –
Đây là giải pháp của tôi cho vấn đề:
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");
}
Tại sao ElementName và RelativeSource lại nhận xét? Tôi đoán bạn gặp phải một vấn đề khi cố gắng sao chép các thuộc tính đó? –
Việc liên kết chỉ cho phép bạn đặt một trong các ElementName, RelativeSource hoặc Source. Nếu bạn cố gắng đặt nhiều hơn một, nó sẽ ném một InvalidOperationException. –
Tôi gặp sự cố khi sử dụng ở trên, ngoại trừ tôi đã sao chép nguồn từ liên kết cũ sang mới. Trong trường hợp của tôi, ràng buộc kế thừa DataContext là nguồn của nó. Khi tôi sao chép nguồn, nó rõ ràng đặt null là nguồn mà dường như làm cho DataContext không được sử dụng. Để khắc phục điều này, hãy sử dụng: 'Source = binding.Source ?? DependencyProperty.UnsetValue; – xr280xr
Tôi chỉ nhận thấy trong BindingBase decompiled mã mà nó có một phương pháp nội Clone()
, vì vậy khác (không an toàn, không nên cố gắng ở nhà, sử dụng nguy cơ của riêng bạn, vv) giải pháp sẽ được sử dụng phản ánh để vượt qua giới hạn truy cập của trình biên dịch:
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 });
}
Không thử, mặc dù vậy, nó có thể không hoạt động.
- 1. Có cách nào để gỡ lỗi hiệu quả các ràng buộc dữ liệu WPF không?
- 2. Java: cách hiệu quả nhất để phòng thủ sao chép một int []?
- 3. Tôi có phương pháp không thực hiện, làm cách nào để cải thiện hiệu quả của nó?
- 4. Javascript: Phương pháp chiều dài có hiệu quả không?
- 5. Phương pháp chung với nhiều ràng buộc
- 6. java: clone phương pháp vi phạm
- 7. Các phương pháp tĩnh có hiệu quả hơn không?
- 8. Tại sao không có phương pháp sao chép sâu trong Ruby?
- 9. Sự khác biệt giữa các phương pháp sao chép và sao chép của Ruby là gì?
- 10. Phương pháp sao chép các hàng R
- 11. Cách thông thường để sao chép tệp trong Gradle - sử dụng Sao chép tác vụ hoặc phương pháp sao chép?
- 12. Cập nhật ràng buộc hiệu quả trong từ điển .NET
- 13. mysql_num_rows() php - nó có hiệu quả không?
- 14. Tại sao không phải là loại ràng buộc một phần của chữ ký phương pháp?
- 15. Phương pháp sao chép từ thành viên
- 16. Tại sao yếu tố không làm việc trên phương pháp bị ràng buộc này?
- 17. Tại sao C# không ràng buộc đúng với phương pháp ghi đè chung?
- 18. Phương pháp ràng buộc để phương pháp cơ bản trong thư viện bên ngoài không thể xử lý các phương pháp ảo mới "giữa"
- 19. Toàn bộ Bản đồ có được sao chép khi chèn một ràng buộc mới không?
- 20. Phương pháp hiệu quả để tính toán xác suất của một tập hợp các kết quả?
- 21. phương pháp hiệu quả để thực hiện tổng kết
- 22. OpenGL, liệu nó có đáng để ràng buộc một cách rõ ràng sau một cuộc gọi vẽ không?
- 23. Phương pháp hiệu quả để tìm phần trăm thời gian
- 24. Phương pháp chung với các ràng buộc chung là
- 25. Spring MVC tùy chỉnh tham số phương pháp ràng buộc
- 26. QWidget.setContentsMargins() có vẻ không hiệu quả: tại sao vậy?
- 27. Hiệu suất ràng buộc WCF
- 28. Không có khả năng quá tải phương pháp chung với các ràng buộc kiểu
- 29. Kịch bản T-SQL để sao chép tất cả các ràng buộc bảng
- 30. Cách sao chép hoặc sao chép một mảng các mảng
Tôi đã thấy rằng tôi không cần phải sao chép một ràng buộc, trong mã tôi có thể sử dụng một ràng buộc nhiều hơn một lần trên các yếu tố khác nhau. –