Используйте функцию логического родителя
Может быть, мой вопрос совершенно глуп, но я стараюсь изо всех сил.
Все, что я хочу сделать, это использовать функцию / свойство родительского элемента.
Я подготовил простой пример без смысла:
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;
}
}