我现在真的在与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中的一个,因此与绑定对象中的文本不同。我只需要抓取显示给用户的文本,而不是底层数据对象。
这里的任何代码大师都有任何建议吗?
干杯,
加文
答案 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代码相同的方式对照与第一行关联的数据对象进行评估。这适用于我的应用程序,但如果有人有更整洁的解决方案,请随时发布答案!