您不能直接引用项目面板实例。但是您可以在 ItemsControl 上定义依赖属性,并在控件加载时在代码隐藏中设置它。然后控件模板可以通过TemplateBinding 引用该属性。
所以在示例中,“AnItemsControl”应该定义一个“SlideContentPanel”类型的依赖属性:
public SlideControl()
{
DefaultStyleKey = typeof(SlideControl);
Loaded += SlideControl_Loaded;
}
public SlideContentPanel TypedPanel
{
get { return (SlideContentPanel)GetValue(TypedPanelProperty); }
set { SetValue(TypedPanelProperty, value); }
}
public static readonly DependencyProperty SlidePanelProperty =
DependencyProperty.Register("TypedPanel", typeof(SlideContentPanel), typeof(AnItemsControl), new PropertyMetadata(null));
现在,当控件加载时,使用VisualTreeHelper 定位面板,并设置依赖属性:
public AnItemsControl()
{
DefaultStyleKey = typeof(AnItemsControl);
Loaded += AnItemsControl_Loaded;
}
private void AnItemsControl_Loaded(object sender, RoutedEventArgs e)
{
TypedPanel = FindItemsPanel<SlideContentPanel>(this);
}
private T FindItemsPanel<T>(FrameworkElement visual)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
{
FrameworkElement child = VisualTreeHelper.GetChild(visual, i) as FrameworkElement;
if (child != null)
{
if (child is T && VisualTreeHelper.GetParent(child) is ItemsPresenter)
{
object temp = child;
return (T)temp;
}
T panel = FindItemsPanel<T>(child);
if (panel != null)
{
object temp = panel;
return (T)temp;
}
}
}
return default(T);
}
现在“AnItemsControl”的控件模板中的按钮可以通过使用模板父项中的“TypedPanel”属性来引用面板:
<Button Content="Next" HorizontalAlignment="Right"
Visibility="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TypedPanel.CanGoRight,
Converter={StaticResource BoolToVisibilityConverter}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Tap">
<ei:CallMethodAction
TargetObject="{Binding RelativeSource={RelativeSource TemplatedParent},Path=TypedPanel}"
MethodName="GoRight" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>