2011-08-17 75 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代碼相同的方式對照與第一行關聯的數據對象進行評估。這將適用於我的應用程序,但如果任何人有一個整潔的解決方案,請隨時發佈答案!

相關問題