在WPF中使用ListView的GridView时访问单元格文本

本文关键字:GridView 访问 单元格 文本 ListView WPF | 更新日期: 2023-09-27 18:05:56

我现在真的在WPF ListView中挣扎,我想象着缺少了一些非常愚蠢的东西,但是在谷歌上搜索了几个小时后,我想我最好问一下。

我试图访问已创建GridView的ListView中单个单元格的文本内容:

<ListView Name="MyListView">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Foo" DisplayMemberBinding="{Binding Foo}"/>
            <GridViewColumn Header="Bar" DisplayMemberBinding="{Binding Bar}"/>
        </GridView>
    </ListView.View>
</ListView>

我添加到列表视图如下:

var foobars = new ObservableCollection<Foobar>();
foobars.Add(new Foobar { Foo = "Hello", Bar = "world" });
MyListView.ItemsSource = foobars;

现在我想从第一行的第二列中获取单词"world"。如果这是WinForms,我会输入:

var word = (string)(((ListViewItem)MyListView.Items[0]).SubItems[1]);

我找不到任何方法在WPF中做到这一点!我意识到我可以做到:

var word = ((Foobar)MyListView.Items[0]).Bar;

但是在我的实际应用程序中,出现在ListView中的文本已经通过基于它所在的列的一对ValueConverters之一,因此与绑定对象中的文本不一样。我只需要抓取显示给用户的文本,而不是底层数据对象。

这里的代码大师有什么建议吗?

欢呼,

Gavin

在WPF中使用ListView的GridView时访问单元格文本

好吧,我找到了一个难看的方法。下面是从第一行第二列单元格中获取"world"的代码:

var columns = ((GridView) MyListView.View).Columns;
var foobar = (Foobar)MyListView.Items[0];
var result = (string)DataBinder.Eval(foobar, (Binding) columns[0].DisplayMemberBinding);

这是使用一个助手类(感谢http://social.expression.microsoft.com/Forums/en-US/wpf/thread/315d2442-b978-4e5f-89cd-1004a51f390d/你节省了很多我的头发从被拉):

public class DataBinder
{
    private static readonly DependencyProperty BindingEvalProperty = DependencyProperty.RegisterAttached(
        "BindingEval",
        typeof(Object),
        typeof(DependencyObject),
        new UIPropertyMetadata(null));
    public static Object Eval(Object data, Binding binding)
    {
        var newbinding = new Binding {Path = binding.Path, Converter = binding.Converter, Source = data};
        var evalobj = new DependencyObject();
        BindingOperations.SetBinding(evalobj, BindingEvalProperty, newbinding);
        return evalobj.GetValue(BindingEvalProperty);
    }
}

因此,这是从第二列抓取绑定对象,并根据与第一行关联的数据对象对其进行评估,与底层GridView代码相同。这将为我的应用程序工作,但如果有人有一个更整洁的解决方案,请随时张贴答案!