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 询问父类是否有任何其他 Canvas 已经具有相同的值 --> 决定做什么。

明天我会发布一个更详细的例子!

4

2 回答 2

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();
        }
    }
}
于 2015-04-10T19:49:12.590 回答
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的 s from 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;
    }
}
于 2015-04-10T20:01:27.977 回答