Наследование + event broadcasting

97
02 сентября 2021, 15:30

Заранее прошу прощения за невнятный заголовок, не придумал как лучше объяснить.

Итак, у меня есть набор WPF-control (кастомных, делаю сам).

Нужно, чтобы каждый из них мог как посылать, так и "получать" события, стало быть, напрашивается интерфейс:

public delegate void MyEventHandler(object parameter);
public interface IMyCommand
{
    event MyEventHandler OnSend;
    event MyEventHandler OnReceive;
}

Вроде как все логично, но нужно знать, кто посылает события, поэтому расширим делегат на тип UserControl:

public enum MyControlType
{
    A,
    B,
    etc..
};
public delegate void MyEventHandler(MyControlType type, object parameter);

И все, опять-таки, логично. Но, так как UserControl'ы - часть WPF приложения, нужно при старте пройти по VisualTreeи подписаться на каждый из них.

Я подумал, что в этом нет ничего сложного (и с точки зрения архитектуры правда нет) - создадим базовый класс или интерфейс, пробежимся по VisualTree, и если тип соответствует - подпишемся.

И вот тут появилась проблема: так как UserControl в WPF - это partial-классы, они не поддерживают multiple inheritance (что, опять-таки, понятно и логично).

Я попытался сделать code trick:

public class MyBaseClass: UserControl
{
}
public partial class MyControl : MyBaseClass
{
}

И это не "жрет" даже VS 2019.

Думаю, ок - мы же можем наследоваться от DependencyObject и искать по VisualTree хрестоматийным методом, которые все, кто умеет гуглить, используют:

public IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
    if (depObj != null)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
            if (child != null && child is T)
                 yield return (T)child;
            foreach (T childOfChild in FindVisualChildren<T>(child))
                   yield return childOfChild;
        }
    }
}

Но этот метод выдает Count = 0

Возможно, я изначально не так спроектировал? Буду благодарен любым советам.

READ ALSO
The application exited with code: 255

The application exited with code: 255

При попытке запуска какой-либо программы через VS выдает такую ошибкуРаньше этого не было, но после обновления ОС на Mac'е началось

127
C#.Значение скобок в массиве массивов

C#.Значение скобок в массиве массивов

Обясните значение каждых скобок при объявлении массива массивов,ведь я понимаю только значение [3],что значит что длина массива - 3А вот почему...

173
Не могу подключиться к локальному серверу MySQL из C#

Не могу подключиться к локальному серверу MySQL из C#

Хочу подключиться к локальному серверу MySQL через приложение C#, но получаю ошибку с первого скрина: named pipes provider error 40

225