WPF - Получить связанный исходный объект из ListView.SelectedItem - PullRequest
0 голосов
/ 12 октября 2019

У меня есть элемент ListView, связанный с коллекцией List<MyObject>. MyObject имеет различные методы, которые я хотел бы вызвать, например, когда пользователь выбирает элемент из ListView и затем нажимает кнопку, чтобы выполнить действие с этим индивидуальным SelectedItem.

XAML:

<ListView x:Name="lvMyListView">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Title" DisplayMemberBinding="{Binding myProperty}"/>
        </GridView>
    </ListView.View>
</ListView>

Код:

// WPF window constructor
public MyWindow()
{
    InitializeComponent();
    List<MyObject> myItems = new List<MyObject>();
    this.SourceInitialized += MyWindow_SourceInitialized;
    lvMyListView.ItemsSource = myItems;
}

// MyObject definition
class MyObject : INotifyPropertyChanged
{
    ...
    public string myProperty { get; set; }
    public void DoSomething()
    {
        ...
    }
}

// Button event
private void myButton_Click(object sender, RoutedEventArgs e)
{
    // MyObject currentItem = lvMyListView.SelectedItem;
    // currentItem.DoSomething();
}

Как я могу получить фактический экземпляр MyObject, который представлен ListView.SelectedItem? Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 12 октября 2019

Я прочитал ваш вопрос несколько раз. Мне кажется, что вы смешиваете MVVM и нормальное внутреннее кодирование, и это делает ваш код трудным для чтения и понимания.

Существует, я полагаю, 2 способа получить доступ к объекту. Если я правильно понял, что вы спросили. Вы можете разыграть:

MyObject currentItem = lvMyListView.SelectedItem as MyObject; 

или использовать lvMyListView.SelectedIndex против своего исходного списка.

Также обратите внимание, что первый параметр может быть null, если не выбран, а второй - * 1010. * поэтому добавьте проверки соответственно.

Но, лучший подход - использовать MVVM и привязку данных в целом. Это длиннее, чем я могу написать здесь, но вы создаете объект модели представления и привязываете свойство выбранного элемента списка к одному из его свойств, и ваша кнопка будет вызывать действие в классе модели представления. Это лучший подход к кодированию WPF. Поэтому, пожалуйста, проверьте это.

0 голосов
/ 12 октября 2019
            //let me know if any bug come, make sure it's selectedItems.Count>0||!=-1
            //using getting selected object in IList
            IList rows = tbl_perListView.SelectedItems;

            //OR accessing DataGridRow,datarow,DataRowView properties (but this method is dirty needs lot of extra code)

            DataRowView row = (DataRowView)tbl_perListView.SelectedItems[0];
            string s = row["name"].ToString();
...