Используйте функцию логического родителя

Может быть, мой вопрос совершенно глуп, но я стараюсь изо всех сил.

Все, что я хочу сделать, это использовать функцию / свойство родительского элемента.

Я подготовил простой пример без смысла:

class A
{
    public List<B> myBs = new List<B>();

    public int CountMyBs()
    {
        return myBs.Count;
    }
}

class B
{
    //here i would like to use "CountMyBs()"
}

Спасибо!

Изменить: я думаю, что я должен предоставить вам больше информации.

Мой пользователь может перетащить значение на холст. Мой холст находится в списке родительского класса. Теперь мой холст хочет знать, имеет ли какой-либо другой холст в списке то же значение.

Моя идея реализовать:

Пользователь выполняет перетаскивание -> Canvas получает событие -> Canvas запрашивает родительский класс, если какой-либо другой Canvas уже имеет такое же значение -> решает, что делать.

Завтра я выложу более подробный пример!

2 ответа

Вам нужно что-то вроде этого:

class A : FrameworkElement
{
    public int CountMyBs() {}
}

class B : FrameworkElement
{
    public void Foo()
    {
        var parent = LogicalTreeHelper.GetParent(this) as A;
        if (parent != null)
        {
            //here i would like to use "CountMyBs()"
            parent.CountMyBs();
        }
    }
}

Вы можете передать экземпляр A через конструктор B:

class B
{
    private readonly A a;

    public B(A a)
    {
        this.a = a;
    }

    public int Foo() //Example use
    {
        return 1 + a.CountMyBs();
    }
}

class A
{
    public List<B> myBs = new List<B>();

    public A()
    {
        myBs.Add(new B(this)); //Pass the current A to B
    }

    public int CountMyBs()
    {
        return myBs.Count;
    }
}

Но это похоже на неприятный запах кода для меня. Если у вас нет особого варианта использования для этого, я бы избегал, чтобы дочерний класс знал свой родительский класс только для доступа к самому списку.

Вы можете просто позвонить Bс из A, с вашим методом в качестве параметра. Чувствует себя более естественно. Это может выглядеть так:

class A
{
    public List<B> myBs = new List<B>();

    public A()
    {
        var someB = new B();
        myBs.Add(someB);
        someB.Foo(CountMyBs());
    }

    public int CountMyBs()
    {
        return myBs.Count;
    }
}

class B
{
    public int Foo(int count) //Example use
    {
        return 1 + count;
    }
}
Другие вопросы по тегам