我有一个listview,其中包含具有int ID和字符串名称的对象。名称列是可由用户编辑的文本框。如果用户更改了名称,我希望能够在列表中搜索具有相同ID的其他对象,并更改这些名称。
我的大问题是,我想使用文本框的LostFocus属性来获取整个行或对象,而不仅仅是文本框。
下面的XAML大大简化了,但我认为它的基本理念是:
<ListView x:Name="linkList"
<GridViewColumn Width="75">
<GridViewColumn.CellTemplate>
<TextBox Text="{Binding linkName}" LostFocus="TextBox_LostFocus"/>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Width="75">
<GridViewColumn.CellTemplate>
<TextBox Text="{Binding linkID}"/>
</GridViewColumn.CellTemplate>
</GridViewColumn>
所以在代码背后:
private void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
//sender is the textbox in this case. so how
//would I get the object in that particular row so I can get its ID#?
}
我需要识别该特定行,因为用户可以点击其他行或按&#34;输入&#34;保存名称更改。因此,按当前选定的行进行操作并不好。有什么想法吗?
答案 0 :(得分:0)
Google使用GetVisualAncestor<T>
扩展程序并使用它。
((TextBox)sender).GetVisualAncestor<ListViewItem>();
答案 1 :(得分:0)
现在非常明显,但我必须找到ListViewItem类型的祖先,并且我能够从该对象中提取我需要的信息。
private void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
ListViewItem changedRow = GetAncestorOfType<ListViewItem>(sender as TextBox);
//now I can get the info I need from the changedRow object!
}
public T GetAncestorOfType<T>(FrameworkElement child) where T : FrameworkElement
{
var parent = VisualTreeHelper.GetParent(child);
if (parent != null && !(parent is T))
return (T)GetAncestorOfType<T>((FrameworkElement)parent);
return (T)parent;
}