#c# #.net #wpf #controls #overriding
#c# #.net #wpf #элементы управления #переопределение
Вопрос:
Мне нужно динамически изменять некоторые привязки данных. Итак, я планировал выполнить операцию во время / после инициализации элемента управления в его родительском элементе.
Но, несмотря на страницу msdn в Control.Метод OnLoad, мой класс отказывается компилироваться:
Ошибка 810 ‘Просмотры.Тест.OnLoad(System.EventArgs)’: не найдено подходящего метода для переопределения
Мой код:
class Test : Control
{
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (true)
{
System.Diagnostics.Debug.Assert(false);
}
}
}
Есть идеи о том, что я делаю не так?
Редактировать: @Roken заметил, что я не соответствую System.Web.UI.Control, потому что мой класс является производным от System .Windows.Элементы управления.Управление
Итак, у меня возникает вопрос: когда и как я должен выполнить свои изменения в привязке этого элемента управления? Какой метод переопределить или на какое событие подписаться?
Комментарии:
1. можете ли вы описать, чего вы пытаетесь достичь? поэтому мы можем посоветовать вам другой способ. кстати, вы можете обработать
Loaded
событие.2. Я подклассирую свой собственный конвертер для перечисления, отображаемого в поле со списком. Мой объект converter нуждается в некоторой внешней обработке (например, в параметрах построения) и не является прямым конвертером, не может передать его просто в чистом XAML, тем более что файл XAML, с которым мне приходится работать, уже состоит из 2000 строк (и это зло). Итак, я бы сделал эту обработку конвертера привязки в коде, стоящем за моим контролем. Вопрос в том, как / когда я могу установить привязку к элементу управления.
Ответ №1:
Это элемент управления Windows Forms или веб-элемент управления? Предоставленная вами ссылка предназначена для веб-элемента управления; элемент управления WinForms не содержит OnLoad() . Для WinForms может быть полезен OnCreateControl() или OnInitialized() для WPF.
Комментарии:
1. элемент управления WPF… какой другой метод я должен переопределить или событие, чтобы подписаться тогда?
2. Посмотрите на OnInitialized() для WPF.
3. Вот и все. msdn.microsoft.com/en-us/library /…
Ответ №2:
Вы уверены, что производны от System.Web.UI.Control
, а не от System.Windows.Forms.Control
?
System.Windows.Forms.Control
не предоставляет виртуальный OnLoad
метод.
Комментарии:
1. действительно, он является производным от System . Windows. Элементы управления. Управление… но в моем случае я не знаю, как взаимодействовать с элементом управления после его инициализации, если нет точки входа, такой как переопределение OnLoad
Ответ №3:
System.Windows.Controls.Control
не OnLoad
метод поставщика, см. MSDN
Ответ №4:
Основываясь на вашем комментарии, я рекомендую вам создать ViewBinder
, который будет настраивать конвертеры с небольшими усилиями и с максимальной прозрачностью.
Проверьте выступление Роба Айзенберга на MIX10 и Caliburn или код из выступления, который можно загрузить с этой страницы.
На основе соглашений фреймворк находит элемент пользовательского интерфейса и сопоставляет его со свойством с тем же именем. И автоматически создает и настраивает привязку:
private static void BindProperties(FrameworkElement view, IEnumerable<PropertyInfo> properties)
{
foreach (var property in properties)
{
var foundControl = view.FindName(property.Name) as DependencyObject;
if(foundControl == null) // find the element
continue;
DependencyProperty boundProperty;
if(!_boundProperties.TryGetValue(foundControl.GetType(), out boundProperty))
continue;
if(((FrameworkElement)foundControl).GetBindingExpression(boundProperty) != null) // already bound
continue;
var binding = new Binding(property.Name) // create the binding
{
Mode = property.CanWrite ? BindingMode.TwoWay : BindingMode.OneWay,
ValidatesOnDataErrors = Attribute.GetCustomAttributes(property, typeof(ValidationAttribute), true).Any()
};
if (boundProperty == UIElement.VisibilityProperty amp;amp; typeof(bool).IsAssignableFrom(property.PropertyType))
binding.Converter = _booleanToVisibilityConverter;
BindingOperations.SetBinding(foundControl, boundProperty, binding);
}
}
Привязка выполняется явно в public static void Bind(object viewModel, DependencyObject view)
методе, который принимает все свойства, определенные в viewModel
type, и связывает их.