在C#,WPF中从选定行获取Gridview中的数据

3

我正在尝试从我在XAML中创建的Gridview中检索数据。

<ListView Name="chartListView" selectionChanged="chartListView_SelectionChanged">
  <ListView.View>
     <GridView>
        <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="250"/>
        <GridViewColumn Header="Type" DisplayMemberBinding="{Binding Type}" Width="60"/>
        <GridViewColumn Header="ID" DisplayMemberBinding="{Binding ID}" Width="100"/>
     </GridView>
  </ListView.View>
</ListView>

我看到了一些类似这样的代码:-
GridViewRow row = GridView1.SelectedRow;
TextBox2.Text = row.Cells[2].Text;

然而我的问题是,我的GridView是在XAML中创建的,并且没有命名,也就是说我不能(或者不知道如何)创建对“gridview1”的引用,因此无法访问其中的对象。

我能否从C#或XAML中为我的gridview命名或创建引用,以便我可以使用上面的代码?

其次,我可以通过名称而不是索引访问数组元素,类似于:

TextBox2.Text = row.Cells["ID"].Text

感谢您的任何帮助。
2个回答

3
你正在做某些非常错误的事情。你不应该尝试从网格单元中读取数据,而是直接从业务对象中读取。如果存在纯XAML解决方案,你应该避免使用过程式代码:
<TextBox x:Name="TextBox2" Text={Binding SelectedItem.ID, ElementName=chartListView}"/>

WPF并不打算像你试图那样使用。因此,读取单个网格单元格是一种不好的方法。也就是说,大致如下:

string UglyHack(string name)
{
    var columns = (chartListView.View as GridView).Columns;
    int index = -1;
    for (int i = 0; i < columns.Count; ++i)
    {
        if ((columns[i].Header as TextBlock).Text == name)
        {
            index = i;
            break;
        }
    }
    DependencyObject j = SelectedListView.ItemContainerGenerator.ContainerFromIndex(SelectedListView.SelectedIndex);
    while (!(j is GridViewRowPresenter)) j = VisualTreeHelper.GetChild(j, 0);
    return (VisualTreeHelper.GetChild(j, index) as TextBlock).Text;
}

1

是的,你可以给你的GridView命名:

<GridView x:Name="chartGridView">
    ...
</GridView>

请确保以下内容包含在窗口定义中:

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

这将使您能够从您的C#代码中引用它。


抱歉,那是我尝试的第一件事。VS显示:在GridView类型中未找到“Name”属性。 - Will
这将使其在代码后台可见。有没有一种方法可以从视图模型中使其可见? - Jeff
@Jeff - 你不应该像那样混淆你的视图和视图模型。 - ChrisF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接