从子元素调用父元素的方法



在以下结构中

<Border ...>
    <ItemsControl>
        <ItemsControl.Template>
            <DataTemplate>
                <ACustomElement>
                    <Border MouseLeftButtonDown="method1">
                </ACustomElement>
            </DataTemplate>
        </ItemsControl.Template>
    </ItemsControl>
</Border>

我想从内部方法1()中调用Acustomelement类中的公共方法。

我到目前为止尝试的方法():

var cr = ((Border)sender).Parent;
cr.method2();

Method2是我的探针素类中的一种公共方法。但这似乎无法识别该方法。

我会收到以下错误:

'depentencyObject'不包含"方法2"的定义,也没有扩展方法2'接受类型的" depentencyObject"的第一个参数(您是否缺少使用指令或汇编引用?)

关于如何解决此问题的任何建议?当然,我只是错过了演员或其他东西...

编辑:以下样式将始终应用于Acustomelement:

<Style TargetType="{x:Type c:ACustomElement}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type c:ACustomElement}">
                <ContentPresenter Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

您必须将cr施放到Acustomelement类型

var cr = (ACustomElement)((Border)sender).Parent;
cr.method2();

否则,您的cr变量是指在异常中看到的依赖项视频类型。

如果您不确定层次结构使用此方法来查找特定类型的父。

private T FindParent<T>(DependencyObject child) where T : DependencyObject {
    var parent = VisualTreeHelper.GetParent(child) as T;
    if (parent != null)
        return parent;
    return FindParent<T>(parent);
}
// usage
private void method1(object sender, MouseButtonEventArgs e)
{
    var cr = FindParent<ACustomElement>((Border)sender);
}

另外,数据策划可以是itemscontrol.itemtemplate的孩子,而不是itemscontrol.template(期望ControlTemplate)

 <ItemsControl.ItemTemplate>
      <DataTemplate>
          <local:ACustomElement>
              <Border MouseLeftButtonDown="method1" />
          </local:ACustomElement>
      </DataTemplate>
 </ItemsControl.ItemTemplate>

update

,正如我在评论中指向问题的那样,将事件处理程序直接添加到您的类型或绑定命令。你为什么使它如此复杂?

尝试将BorderTag属性绑定到自定义控件:

<ACustomElement>
    <Border MouseLeftButtonDown="method1" Tag="{Binding RelativeSource={RelativeSource AncestorType=ACustomElement}}">
</ACustomElement>

...并在事件处理程序中施放Tag属性:

var cr = sender as Border;
var ctrl = cr.Tag as ACustomElement;
ctrl.method2();

相关内容

  • 没有找到相关文章

最新更新