2011-08-17 76 views
0

我真的很困扰WPF ListView,我想像一个失踪的东西真的很愚蠢,但经过几个小时的谷歌搜索后,尽管我最好问。当在WPF中使用ListView的GridView时访问单元格文本

我试图访问已经用一个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; 

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

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

我找不到在WPF中这样做的任何方法!我知道我可以做的:

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

但我真正的应用程序,它会出现在ListView的文本已经通过基于它在其列,所以一对夫妇ValueConverters的一个不一样的文本在绑定对象中。我只需要抓取显示给用户的文本,而不是底层的数据对象。

做任何代码大师这里有什么建议?

干杯,

加文

+0

我认为这只是让你回到源代码,但要尝试CollectionViewSource.GetDefaultView(MyListView) – Paparazzi 2011-08-17 12:56:56

回答

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

相关问题