Как вы получаете значения из SelectedItem в многостолбцовом ListView в WPF? - PullRequest
0 голосов
/ 30 июня 2011

У меня есть элемент управления ListView, как показано ниже

XAML

<ListView Name="myListView" MinHeight="200" FontSize="14" Style="{StaticResource DataGridStyle}">
     <ListView.View>
         <GridView>
             <GridViewColumn Header="Reference Code" Width="0" DisplayMemberBinding="{Binding ReferenceCodeDescription}" HeaderContainerStyle="{StaticResource GridViewColumnHeaderStyle}"/>
             <GridViewColumn Header="Description" Width="594" DisplayMemberBinding="{Binding Description}"   />
         </GridView>
     </ListView.View>
     <ListView.ItemsPanel>
         <ItemsPanelTemplate>
             <VirtualizingStackPanel />
         </ItemsPanelTemplate>
     </ListView.ItemsPanel>
 </ListView>

Я заполнил элемент управления ListView данными, используя LINQ to Entities.

Code-Behind

Dim Stk As New List(Of Stock)
            Dim Ref As New List(Of ReferenceCode)

            Stk = Context.Stocks.ToList
            Ref = Context.ReferenceCodes.ToList

            Dim mySource = From s In Stk
                           Join r In Ref On s.StockID Equals r.StockID
                           Where s.Description.ToLower.Contains(txtSearch.Text.ToLower)
                           Select r.ReferenceCodeDescription, s.Description

            myListView.ItemsSource = mySource

Мой вопрос заключается в том, как получить ссылку на отдельные элементы GridViewColumn из свойства SelectedItem объекта ListView?

Когда я пытаюсь

myListView.SelectedItem 

, я получаю всюстрока назад (например: {Код ссылки = Z88, Описание = НЕФТЬ ФИЛЬТР}

Я подозреваю, что я использую анонимный тип в качестве моего ItemsSource и что, если я использовал именованный тип, я мог бы опросить SelectedItemлучше, но я не уверен, как это сделать.

Есть идеи или советы?

Ответы [ 3 ]

1 голос
/ 03 сентября 2013

Приведенное выше решение выглядит довольно многословно - вот еще один способ, который я предпочитаю из-за его простоты ...

При попытке получить к нему доступ в коде xaml.vb:

dim myItem as DataRowView = myListView.SelectedItem
dim myColumn1 as String = myItem.Row.Item(0)
dim myColumn2 as Date = myItem.Row.Item(1)
etc.

При доступе к нему в ViewModel.vb создайте свойство для DataRowView и в xaml привяжите SelectedItem к свойству представления строк данных.Затем к столбцам в строке можно получить доступ, как указано выше.

1 голос
/ 30 июня 2011

Создайте класс с нужными вам свойствами и создайте экземпляры этого класса в части select запроса Linq, назначив свойства запрашиваемого объекта свойствам вашего нового экземпляра (пример для этого можетможно также найти на MSDN ).Если вы собираетесь повторно использовать созданные объекты за пределами локальной области видимости, , а не используйте анонимные типы.Затем вы можете привести SelectedItem к этому классу и получить доступ к этим свойствам.

(я не знаю, можете ли вы сделать это в vb.net, но в этот вопрос здесь метод дляприведено приведение анонимного типа в C # (далее в C # только вы можете просто сделать элемент динамический и получить доступ к свойствам по своему усмотрению).Редактировать: C # Пример:

public class MyItem
{
    public string ReferenceCodeDescription { get; set; }
    public string Description { get; set; }
}
var items = from r in ItemsA
            join s in ItemsB on r.StockID equals s.StockID
            select new MyItem()
            {
                ReferenceCodeDescription = r.ReferenceCodeDescription,
                Description = s.Description
            };
myListView.ItemsSource = items;
MyItem item = (MyItem)myListView.SelectedItem;
MessageBox.Show(item.Description);
0 голосов
/ 30 июня 2011

Для всех вас, программистов VB исчезающих видов (таких как я), я преобразовал решение H.B в VB!

Public Class MyItem
    Public Property ReferenceCodeDescription() As String
        Get
            Return m_ReferenceCodeDescription
        End Get
        Set(ByVal value As String)
            m_ReferenceCodeDescription = Value
        End Set
    End Property
    Private m_ReferenceCodeDescription As String
    Public Property Description() As String
        Get
            Return m_Description
        End Get
        Set(ByVal value As String)
            m_Description = Value
        End Set
    End Property
    Private m_Description As String
End Class

Dim mySource = From r In Ref
               Join s In Stk On r.StockID Equals s.StockID
               Select New MyItem With { _
                      .ReferenceCodeDescription = r.ReferenceCodeDescription,
                      .Description = s.Description }

    myListView.ItemsSource = mySource

Dim item As MyItem = DirectCast(myListView.SelectedItem, MyItem)
MessageBox.Show(item.Description)

Благодаря H.B.

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