Система.Windows.Элементы управления.Управление без метода OnLoad

#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, и связывает их.