C# 在网格视图中引用单元格中的文本框

C# 在网格视图中引用单元格中的文本框,c#,wpf,listview,data-binding,C#,Wpf,Listview,Data Binding,因此,我在视图prop中使用GridView制作了一个ListView: <ListView Grid.Row="1" Name="TicketListView" Margin="20,5,20,5"> <ListView.View> <GridView> <GridViewColumn Header="Owned" DisplayMemberBinding="{Binding Ow

因此,我在视图prop中使用
GridView
制作了一个
ListView

<ListView Grid.Row="1" Name="TicketListView" Margin="20,5,20,5">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Owned" DisplayMemberBinding="{Binding Owned}"/>
                <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/>
                <GridViewColumn Header="Price" DisplayMemberBinding="{Binding Price, ConverterCulture='en-US', StringFormat={}{0:C2}}"/>
                <GridViewColumn Header="Amount">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox MinWidth="20" TextAlignment="Center" Margin="5" Text="{Binding Bought, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>                
        ...
</ListView>

...
在这个列表视图中选择项目时,我想重点关注特定的
文本框
,这样您就不必点击
文本框
来写,而是可以点击项目(行)并开始更改其值。希望你能理解

这是可能的,还是我应该用另一种方式执行此列表?

关于listitem changed事件 做


您可以处理
ListViewItem
PreviewMouseLeftButtonDown
事件,并使用
VisualTreeHelper
类获取对
文本框的引用:

<ListView Grid.Row="1" Name="TicketListView">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <EventSetter Event="PreviewMouseLeftButtonDown" Handler="TicketListView_PreviewMouseLeftButtonDown" />
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Owned" DisplayMemberBinding="{Binding Owned}"/>
            <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/>
            <GridViewColumn Header="Price" DisplayMemberBinding="{Binding Price, ConverterCulture='en-US', StringFormat={}{0:C2}}"/>
            <GridViewColumn Header="Amount">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox MinWidth="20" TextAlignment="Center" Margin="5" Text="{Binding Bought, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>


private void TicketListView\u PreviewMouseLeftButtonDown(对象发送器,鼠标按钮ventargs e)
{
ListViewItem lvi=作为ListViewItem的发件人;
TextBox TextBox=GetChildOfType(lvi);
如果(文本框!=null)
{
textBox.Dispatcher.BeginInvoke(新操作(()=>
{
bool b=textBox.Focus();
键盘。焦点(文本框);
}));
}
}
私有静态T GetChildOfType(DependencyObject depObj),其中T:DependencyObject
{
if(depObj==null)
返回null;
for(int i=0;i
我不知道如何感谢你……你从哪里知道这一切?不客气,但请记住投票选出有用的答案:。我从哪里知道这一切?经验为王:)
<ListView Grid.Row="1" Name="TicketListView">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <EventSetter Event="PreviewMouseLeftButtonDown" Handler="TicketListView_PreviewMouseLeftButtonDown" />
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Owned" DisplayMemberBinding="{Binding Owned}"/>
            <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/>
            <GridViewColumn Header="Price" DisplayMemberBinding="{Binding Price, ConverterCulture='en-US', StringFormat={}{0:C2}}"/>
            <GridViewColumn Header="Amount">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox MinWidth="20" TextAlignment="Center" Margin="5" Text="{Binding Bought, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>
private void TicketListView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    ListViewItem lvi = sender as ListViewItem;
    TextBox textBox = GetChildOfType<TextBox>(lvi);
    if (textBox != null)
    {
        textBox.Dispatcher.BeginInvoke(new Action(() =>
        {
            bool b = textBox.Focus();
            Keyboard.Focus(textBox);
        }));
    }
}

private static T GetChildOfType<T>(DependencyObject depObj) where T : DependencyObject
{
    if (depObj == null)
        return null;

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
    {
        var child = VisualTreeHelper.GetChild(depObj, i);
        var result = (child as T) ?? GetChildOfType<T>(child);
        if (result != null) return result;
    }
    return null;
}