【问题标题】:Use function of logical parent使用逻辑父函数
【发布时间】:2015-04-10 19:45:02
【问题描述】:

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

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

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

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 已经具有相同的值 --> 决定做什么。

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

【问题讨论】:

标签: c# wpf function parent logical-tree


【解决方案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();
        }
    }
}

【讨论】:

  • 感谢您的快速回复!不幸的是 parent 等于 null
  • @MisterPresident:这只是一个代码 sn-p 作为对您的样本的响应。如果你有一个真正的逻辑树(例如,一个 XAML 片段),最好发布它。否则很难帮你。
  • 我稍微编辑了我的问题。也许这个问题描述得很糟糕。
【解决方案2】:

可以通过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;
    }
}

但对我来说,这似乎是一种糟糕的代码气味。除非你有一个非常具体的用例,否则我会避免让子类知道它的父类只是为了访问它自己的列表。

您可以简单地从A 调用您的Bs,并将您的方法结果作为参数。感觉更自然。它可能看起来像:

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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    相关资源
    最近更新 更多