在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
好吧,我找到了一个难看的方法。下面是从第一行第二列单元格中获取"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代码相同。这将为我的应用程序工作,但如果有人有一个更整洁的解决方案,请随时张贴答案!