簡體   English   中英

對DataTemplate內部的TextBox的引用

[英]Reference to a TextBox inside a DataTemplate

如何獲得對僅在DataTemplate內部定義的TextBox的引用(假設我剛剛將此DataTemplate應用到了網格中的某些單元格)。

到目前為止,我在TextBox事件中使用發件人來檢索此內容。

謝謝,瑞

為了在數據模板中獲取控件的引用,處理事件然后使用發送者是可用選項之一。 您還可以嘗試以下一種選擇:

在.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);
        }
    }

希望這可以幫助!!

抱歉,您做錯了。
沒有充分的理由說明為什么應該引用DataTemplate IMO中的元素。 此外,您確實沒有充分的理由注冊控制事件。

作為MVVM體系結構的一部分,我們開始研究數據和交互。
在數據方面-所有數據都綁定到ViewModel。
在交互方面-使用ICommands,所有事件都連接到命令。

因此,在您的TextBox示例中-為什么要聽文本框事件? 使用TwoWay DataBinding了解TextBox文本何時更改。
在另一個證明事件合理的示例中,例如button.Click? 使用Button.Command =“ {Binding myCommand}”使命令處理事件。

遇到問題的原因是因為您試圖將圓釘釘在方孔中。

-賈斯汀

我同意賈斯汀。

但是,如果由於某種原因綁定到某些屬性有問題,並且您仍然需要引用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM