引用DataTemplate中的TextBox

时间:2009-12-21 18:27:13

标签: c# .net silverlight

如何获取仅在DataTemplate中定义的TextBox的引用(假设我刚刚将此DataTemplate应用于网格中的某个单元格)。

到目前为止,我在TextBox事件中使用发件人来检索它。

谢谢, 瑞

3 个答案:

答案 0 :(得分:2)

要获取数据模板内控件的引用,处理事件然后使用发送者是可用选项之一。您还可以尝试另外一个选项:

.xaml中的

    <toolkit:DataGrid Name="datagrid" Margin="0,0,0,28" AutoGenerateColumns="False">
        <toolkit:DataGrid.Columns>
            <toolkit:DataGridTextColumn Header="First Name" Binding="{Binding FirstName}"/>
            <toolkit:DataGridTemplateColumn Header="Last Name">
                <toolkit:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding LastName}"/>
                    </DataTemplate>
                </toolkit:DataGridTemplateColumn.CellTemplate>
            </toolkit:DataGridTemplateColumn>
        </toolkit:DataGrid.Columns>
    </toolkit:DataGrid>
    <Button Height="22" VerticalAlignment="Bottom" Click="Button_Click" />
.xaml.cs 中的

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        InitializeMouseHandlersForVisual(datagrid);
    }

    public void InitializeMouseHandlersForVisual(Visual visual)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
        {
            Visual childVisual = (Visual) VisualTreeHelper.GetChild(visual, i);
            if (childVisual is TextBox)
                MessageBox.Show("textbox Found");
            // Recursively enumerate children of the child visual object.

            InitializeMouseHandlersForVisual(childVisual);
        }
    }

希望这会有所帮助!!

编辑:

如果您想使用x:Name,那么您还需要至少获取ContentPresenter,并且要获取ContentPresenter,您需要浏览元素树。您需要进行的更新是:

.xaml中的

    <DataTemplate>
        <TextBox x:Name="text" Text="{Binding LastName}"/>
     </DataTemplate>
.xaml.cs 中的

    public void InitializeMouseHandlersForVisual(Visual visual)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
        {
            Visual childVisual = (Visual) VisualTreeHelper.GetChild(visual, i);
            ContentPresenter myContentPresenter = childVisual as ContentPresenter;
            if (myContentPresenter != null)
            {
                // Finding textBlock from the DataTemplate that is set on that ContentPresenter
                DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;
                if (myDataTemplate != null)
                {
                    TextBox myTextBox = (TextBox)myDataTemplate.FindName("text", myContentPresenter);
                    MessageBox.Show("textbox Found");
                }
            }
            InitializeMouseHandlersForVisual(childVisual);
        }
    }

希望这会有所帮助!!

答案 1 :(得分:1)

抱歉,但你做错了。
没有充分的理由说明为什么要引用DataTemplate IMO中的元素。 而且,你真的没有理由去注册控制赛。

作为MVVM架构的一部分,我们开始关注数据和交互 在数据方面 - 一切都是数据绑定到ViewModel 在交互方面 - 使用ICommands将所有事件连接到命令。

因此,在TextBox示例中 - 为什么要监听文本框事件?使用TwoWay DataBinding来了解TextBox文本何时更改 在另一个事件合理的例子中,例如button.Click?使用Button.Command =“{Binding myCommand}”让命令处理事件。

您遇到问题的原因是因为您试图在方孔中强制使用圆钉。

- 贾斯汀

答案 2 :(得分:0)

我同意贾斯汀。

但是如果由于某种原因绑定到某些属性是有问题的并且您仍然需要在SILVERLIGHT中引用数据模板内的控件(上面的解决方案适用于WPF组件),您可以执行以下操作:

TextBox textBox = null;

   if (datagrid.SelectedItem != null)
      textBox = datagrid.Columns[1].GetCellContent(datagrid.SelectedItem) as TextBox;

   if (textBox != null)
      MessageBox.Show(textBox.Text);