使用逻辑父代的功能

时间:2015-04-10 19:45:02

标签: c# wpf function parent logical-tree

也许我的问题完全是愚蠢的,但我正努力做到最好。

我想要做的就是使用父元素的函数/属性。

我准备了一个没有意义的简单例子:

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

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

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

谢谢!

编辑:我想我必须提供更多信息。

我的用户可以将值拖到画布上。 我的画布位于父类的列表中。 现在我的画布想知道列表中的任何其他画布是否已经具有相同的值。

我想要实现:

用户进行拖动 - &gt;画布获得一个事件 - &gt;如果任何其他Canvas已经具有相同的值,Canvas会询问父类 - &gt;决定做什么。

明天我将发布详细的例子!

2 个答案:

答案 0 :(得分: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();
        }
    }
}

答案 1 :(得分:0)

您可以通过B:

的构造函数传递A的实例
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;
    }
}