WPF Listview - 获取属性更改的行

时间:2015-08-13 23:37:57

标签: wpf listview

我有一个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;保存名称更改。因此,按当前选定的行进行操作并不好。有什么想法吗?

2 个答案:

答案 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;
}