wpf - 无法从 TabControl DataTemplate 获得控件

标签 wpf datatemplate tabcontrol

在过去的 2 天里,我一直在谷歌上搜索这个,但无处可去,我只是无法对 tabcontrol 的数据模板中的任何控件做任何事情。

首先,代码:

private void Window_Loaded(object sender, RoutedEventArgs e) {
    tabControl1.ItemsSource = new string[] { "TabA", "TabB", "TabC" };
}

private void tabControl1_SelectionChanged(object sender, SelectionChangedEventArgs e) {
    ContentPresenter cp = tabControl1.Template.FindName("PART_SelectedContentHost", tabControl1) as ContentPresenter;

    DataTemplate dt = tabControl1.ContentTemplate;
    Grid g = tabControl1.ContentTemplate.FindName("myGrid", cp) as Grid;
    g.Background = new SolidColorBrush(Colors.Red);
}

xml
<Window x:Class="tabTest.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" Loaded="Window_Loaded">
<Grid>
    <TabControl IsSynchronizedWithCurrentItem="True" Height="140" Name="tabControl1" Width="230" SelectionChanged="tabControl1_SelectionChanged">
        <TabControl.ContentTemplate>
            <DataTemplate>
                <Grid x:Name="myGrid">                        
                </Grid>
            </DataTemplate>    
        </TabControl.ContentTemplate>            
    </TabControl>
</Grid>

简而言之,这一行:
Grid g = tabControl1.ContentTemplate.FindName("myGrid", cp) as Grid;

抛出错误“System.InvalidOperationException” 此操作仅对应用了此模板的元素有效。

这个特别的想法我来自 here

我找到了很多其他方法来做到这一点,但我似乎无处可去:(希望有人能指出我正确的方向:)

最佳答案

看起来它与运行时实例化 TabControl 的方式有关。似乎第一次引发 SelectionChanged 事件时 ContentTemplate 还没有准备好访问。如果您再次运行代码并跳过对 ContentTemplate 的第一次访问,您将看到在后续事件中您可以访问此属性而不会引发异常。

通常这些类型的错误可以通过调用 Dispatcher.BeginInvoke 来克服,在这种情况下,它允许运行时在执行代码之前完成选项卡控件的初始化。

Dispatcher.BeginInvoke(new Action(() =>
    {
        ContentPresenter cp = tabControl1.Template.FindName("PART_SelectedContentHost", tabControl1) as ContentPresenter;
        Grid g = tabControl1.ContentTemplate.FindName("myGrid", cp) as Grid;
        g.Background = new SolidColorBrush(Colors.Red);
    }));

关于wpf - 无法从 TabControl DataTemplate 获得控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6232305/

相关文章:

wpf - 将数据模板绑定(bind)到 ContentControl 的内容

wpf - 无法通过 DataTrigger 设置 ContentTemplate

c# - TabControl 上的图像对齐问题

.net - WPF DataGrid 验证/绑定(bind)模式错误

wpf - TransformToDevice 在 Windows 8.1 上不返回正确的 DPI 系数

c# - WPF中如何实现双向数据绑定(bind)?

WPF 数据网格 : Binding DataGridColumn visibility to ContextMenu MenuItems IsChecked (MVVM)

c# - 从 DataTemplate 绑定(bind) ZIndex

.net - 为每个 TabItem 重用网格行定义

.net - WinForms 标签页不重新绘制窗体调整大小