Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 访问内容模板中控件的方法_Wpf_Binding_Datatemplate_Tabcontrol - Fatal编程技术网

Wpf 访问内容模板中控件的方法

Wpf 访问内容模板中控件的方法,wpf,binding,datatemplate,tabcontrol,Wpf,Binding,Datatemplate,Tabcontrol,相对新来的WPF,这可能会有一个简单的解决方案(我希望!)。我有一个具有两个属性的类: public class MyClass { public String Name { get; set; } public String Description { get; set; } } 我有一个用户控件,它有一个textblock和一个按钮:textblock显示文本(显然),该按钮用于加粗或取消绑定文本块的文本: MyControl.xaml: <UserControl

相对新来的WPF,这可能会有一个简单的解决方案(我希望!)。我有一个具有两个属性的类:

public class MyClass
{
    public String Name { get; set; }
    public String Description { get; set; }
}
我有一个用户控件,它有一个textblock和一个按钮:textblock显示文本(显然),该按钮用于加粗或取消绑定文本块的文本:

MyControl.xaml:

<UserControl
    x:Class="WpfApplication1.MyControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    mc:Ignorable="d" 
    d:DesignHeight="300"
    d:DesignWidth="300"
    xmlns:this="clr-namespace:WpfApplication1">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="48" />
        </Grid.ColumnDefinitions>

        <TextBlock
            x:Name="txtDescription"
            Grid.Column="0"
            Text="{Binding Path=Description, RelativeSource={RelativeSource AncestorType={x:Type this:MyControl}}}" />

        <Button
            x:Name="btnBold"
            Grid.Column="1"
            Content="Bold"
            Click="btnBold_Click" />
    </Grid>
</UserControl>
在我的主窗口中,我有一个选项卡控件,它有一个项目模板(在每个选项卡的标题中显示MyClass.Name)和一个内容模板。内容模板包含上述my控件和MyClass之一。说明绑定到MyControl。说明:

MainWindow.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"
    xmlns:this="clr-namespace:WpfApplication1">
    <Grid>
        <TabControl x:Name="tabItems">
            <TabControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}" />
                </DataTemplate>
            </TabControl.ItemTemplate>

            <TabControl.ContentTemplate>
                <DataTemplate>
                    <this:MyControl
                        Description="{Binding Description}" />
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>
    </Grid>
</Window>
<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"
    xmlns:this="clr-namespace:WpfApplication1">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />            
        </Grid.RowDefinitions>

        <TabControl x:Name="tabItems" Grid.Row="0">
            <TabControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}" />
                </DataTemplate>
            </TabControl.ItemTemplate>

            <TabControl.ContentTemplate>
                <DataTemplate>
                    <this:MyControl
                        x:Name="myControl"
                        Description="{Binding Description}"/>
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>

        <Button Grid.Row="1" Content="Toggle Selected Tab" Click="Button_Click" />
    </Grid>
</Window>
我知道我可以通过调用tabItems.SelectedContentTemplate访问数据模板,但据我所知,我无法访问模板中的控件(我也不认为我应该这样做)。有FindName方法,但我不知道pass作为templatedParent参数


任何帮助都将不胜感激。

您可以浏览
VisualTree
找到您要查找的控件

例如,我使用了一组允许我调用如下内容的函数:

var myControl = VisualTreeHelpers.FindChild<MyControl>(myTabControl);
if (myControl != null)
    myControl.ToggleBold();
var myControl=visualtreehelopers.FindChild(myTabControl);
if(myControl!=null)
myControl.ToggleBold();

您是否考虑过使用MVVM来实现此功能?
<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"
    xmlns:this="clr-namespace:WpfApplication1">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />            
        </Grid.RowDefinitions>

        <TabControl x:Name="tabItems" Grid.Row="0">
            <TabControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}" />
                </DataTemplate>
            </TabControl.ItemTemplate>

            <TabControl.ContentTemplate>
                <DataTemplate>
                    <this:MyControl
                        x:Name="myControl"
                        Description="{Binding Description}"/>
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>

        <Button Grid.Row="1" Content="Toggle Selected Tab" Click="Button_Click" />
    </Grid>
</Window>
...

private void Button_Click(object sender, RoutedEventArgs e)
{
    MyClass myClass = tabItems.SelectedItem as MyClass;
    MyControl myControl;

    ///get the instance of myControl that is contained
    ///in the content template of tabItems for the
    ///myClass item

    myControl.ToggleBold();
}

...
var myControl = VisualTreeHelpers.FindChild<MyControl>(myTabControl);
if (myControl != null)
    myControl.ToggleBold();