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

时间:2011-08-17 12:14:33

标签: c# wpf listview gridview

我现在真的在与WPF ListView挣扎,我想失去了一些非常愚蠢的东西,但是经过几个小时的谷歌搜索我虽然最好问一下。

我正在尝试访问ListView中使用GridView创建的单个单元格的文本内容:

<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;

现在我想从第一行的第二列中获取“世界”这个词。如果这是WinForms,我会输入:

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

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

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

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

这里的任何代码大师都有任何建议吗?

干杯,

加文

1 个答案:

答案 0 :(得分:0)

好的,发现了一种丑陋的方式来做到这一点。以下是从第一行,第二列单元格中获取“世界”的代码:

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代码相同的方式对照与第一行关联的数据对象进行评估。这适用于我的应用程序,但如果有人有更整洁的解决方案,请随时发布答案!