Доступ к тексту ячейки при использовании GridView ListView в WPF - PullRequest
0 голосов
/ 17 августа 2011

В настоящий момент я действительно борюсь с WPF ListView, я представляю, что упускаю что-то действительно глупое, но после пары часов поиска в Google, я подумал, что лучше спросить.

Я пытаюсь получить доступ к текстовому содержимому отдельных ячеек в 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, в зависимости от того, в каком столбце он находится, и поэтому не совпадает с текстом в объекте привязки. Мне просто нужно захватить текст, который отображается для пользователя, а не базовый объект данных.

Есть ли у кого-нибудь из гуру кода какие-либо советы ??

Приветствия

Gavin

1 Ответ

0 голосов
/ 18 августа 2011

Хорошо, нашел уродливый способ сделать это.Вот код для получения «мира» из первой строки, ячейки второго столбца:

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.Это будет работать для моего приложения, но если у кого-то есть более подходящее решение, пожалуйста, не стесняйтесь отправить ответ!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...