在我的代码中,我将MessageBoxTabControl.ItemsSource设置为Observable Collection。
<TabControl x:Name="MessageBoxTabControl">
<TabControl.ContentTemplate>
<DataTemplate>
<ListBox x:Name="MessageListBox" />
<!-- ^ I want a reference to this control -->
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
假设我有相关的tabcontrol和tabitem,我怎样才能获得对ListBox的引用?
答案 0 :(得分:3)
你有没有想过做任何你想做的事情?通常,当您拥有DataTemplate时,您可能希望在该模板内的控件上设置的任何属性应该是静态的(因此为什么要访问它们)或依赖于提供的数据,然后应该由DataBinding实现。
您可以使用以下代码获取ListBox。我仍然觉得重新考虑你的结构而不是使用这段代码会更好。
的Xaml:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<TabControl x:Name="MessageBoxTabControl">
<TabControl.ContentTemplate>
<DataTemplate >
<ListBox x:Name="MessageListBox" >
<ListBoxItem Content="ListBoxItem 1" /> <!-- just for illustration -->
</ListBox>
</DataTemplate>
</TabControl.ContentTemplate>
<TabItem Header="Tab 1" />
<TabItem Header="Tab 2" />
</TabControl>
</Window>
代码背后:
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
ListBox lbx = FindVisualChildByName<ListBox>(this.MessageBoxTabControl, "MessageListBox");
if (lbx != null)
{
// ... what exactly did you want to do ;)?
}
}
private T FindVisualChildByName<T>(DependencyObject parent, string name) where T : FrameworkElement
{
T child = default(T);
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
var ch = VisualTreeHelper.GetChild(parent, i);
child = ch as T;
if (child != null && child.Name == name)
break;
else
child = FindVisualChildByName<T>(ch, name);
if (child != null) break;
}
return child;
}
还有第二种类似的方法,实际上使用模板,但仍然依赖于可视化树来获取ContentPresenter(FindVisualChild实现类似于上面):
ContentPresenter cp = FindVisualChild<ContentPresenter>(this.MessageBoxTabControl);
ListBox lbx = cp.ContentTemplate.FindName("MessageListBox", cp) as ListBox;
请注意,由于这种对可视树的依赖性,您始终只能使用此方法找到所选选项卡的ListBox。
答案 1 :(得分:0)
应该是这样的:
TabItem relevantTabItem = howeverYouGetThisThing();
var grid = System.Windows.Media.VisualTreeHelper.GetChild(relevantTabItem, 0);
var listBox = (ListBox) System.Windows.Media.VisualTreeHelper.GetChild(grid, 0);