在以下结构中
<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
,正如我在评论中指向问题的那样,将事件处理程序直接添加到您的类型或绑定命令。你为什么使它如此复杂?
尝试将Border
的Tag
属性绑定到自定义控件:
<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();