[英]Reference to a TextBox inside a DataTemplate
如何獲得對僅在DataTemplate內部定義的TextBox的引用(假設我剛剛將此DataTemplate應用到了網格中的某些單元格)。
到目前為止,我在TextBox事件中使用發件人來檢索此內容。
謝謝,瑞
為了在數據模板中獲取控件的引用,處理事件然后使用發送者是可用選項之一。 您還可以嘗試以下一種選擇:
<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" />
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,則需要遍歷元素樹。 您需要進行的更新是:
<DataTemplate>
<TextBox x:Name="text" Text="{Binding LastName}"/>
</DataTemplate>
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.