Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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 如何访问DataTemplate中的控件_Wpf_Silverlight_Silverlight 3.0_Datatemplate_Itemtemplate - Fatal编程技术网

Wpf 如何访问DataTemplate中的控件

Wpf 如何访问DataTemplate中的控件,wpf,silverlight,silverlight-3.0,datatemplate,itemtemplate,Wpf,Silverlight,Silverlight 3.0,Datatemplate,Itemtemplate,我在数据模板中有几个文本块,如下所示: <DataTemplate> <StackPanel x:Name="stackPanelItems" Orientation="Horizontal"> <TextBlock x:Name="myTextBox" HorizontalAlignment="Center" VerticalAlignment="Top" FontSize="14" /> </StackPane

我在数据模板中有几个文本块,如下所示:

 <DataTemplate>
    <StackPanel x:Name="stackPanelItems" Orientation="Horizontal">
        <TextBlock  x:Name="myTextBox" HorizontalAlignment="Center" VerticalAlignment="Top"   FontSize="14" />
    </StackPanel>
  </DataTemplate>

现在,我们需要在某些场景中设置
myTextBox
,但不希望使用loaded或click事件,然后通过
sender
访问控件

我可以用其他的方法吗

谢谢


Subhen

不幸的是,有一种方法可以像访问命名对象一样简单。假设您使用绑定来填充此数据模板,一个选项是迭代父控件的子对象,并根据已知值检查文本字段。稍微干净一点的方法可能是使用Tag属性(可以绑定到任何对象)并以这种方式进行比较

另一个选项(我最常用于类似的事情)是向要绑定的对象添加属性,并将该属性绑定到可见性(如有必要,使用转换器)。例如,如果当前正在绑定到ObservableCollection,请将绑定更改为ObservableCollection,其中StringWithVisibility看起来像:

public class StringWithVisibility
{
    public string Text {get; set;}
    public bool IsVisible {get; set;}
}
<DataTemplate>
    <StackPanel x:Name="stackPanelItems" Orientation="Horizontal">
        <TextBlock Text="{Binding Text}" Visibility={Binding IsVisible, Converter={StaticResource BoolVisibilityConverter}} />
    </StackPanel>
</DataTemplate>
然后,您的模板看起来像:

public class StringWithVisibility
{
    public string Text {get; set;}
    public bool IsVisible {get; set;}
}
<DataTemplate>
    <StackPanel x:Name="stackPanelItems" Orientation="Horizontal">
        <TextBlock Text="{Binding Text}" Visibility={Binding IsVisible, Converter={StaticResource BoolVisibilityConverter}} />
    </StackPanel>
</DataTemplate>


您已经创建了相应的IValueConverter作为资源。如果您不熟悉转换器,文档如下:

转换器是最好的方法,但要回答您的问题,您可以通过代码隐藏的方式访问控件:

TextBox myTextbox = GetTemplateChild("myTextbox") as Textbox;
if (myTextbox != null)
{
   // do something
}

@Slugster,我在数据模板中有4个不同的文本框,我想从不同的按钮点击中交换Visibiliti选项。你的问题毫无意义。要使名为myTextBox的文本块折叠,只需更改其可见性属性yo collapsed。自从命名后,您就有了对它的引用。这可以通过代码隐藏在任何你想做的地方。@Wallstreet程序员,如果文本框存在于数据模板中,我们就不能通过它的名称来访问它。建议你自己试试。你能回答这个问题吗: