2015-04-10 1 views
0

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

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

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

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 задать родительский класс, если любой другой холст уже имеет одинаковое значение -> решить, что делать.

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

+0

Я отредактировал ваше название. Пожалуйста, ознакомьтесь с [this Meta SE dicussion] (http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles). –

ответ

1

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

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(); 
     } 
    } 
} 
+0

Спасибо за ваш быстрый ответ! К сожалению ** родительский эквивалент null **! – MisterPresident

+0

@MisterPresident: это всего лишь фрагмент кода в качестве ответа на ваш образец. Если у вас есть реальное логическое дерево (например, фрагмент XAML), лучше разместить его. В противном случае вам будет сложно помочь. – Dennis

+0

Я немного изменил свой вопрос. Может быть, вопрос был написан очень плохо. – MisterPresident

0

Вы можете передать экземпляр через конструктор 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; 
    } 
}