2010-01-08 1 views
1

В WPF приложении У меня есть ListView, который соединен с ObservableCollection ShQuCollection через привязку данных:Как ссылаться на ObservableCollection из WPF ListView SelectionChanged обработчик событий?

<ListView Name="ShSelList" ItemsSource="{Binding Source={StaticResource myDataSource},Path=ShQuCollection}" SelectionChanged="ShSelList_SelectionChanged"> 
    <ListView.View> 
     <GridView> 
     <GridViewColumn Header="Code" DisplayMemberBinding="{Binding StrCode}"/> 
     <GridViewColumn Header="Date" DisplayMemberBinding="{Binding Date}"/> 
     <GridViewColumn Header="Time" DisplayMemberBinding="{Binding Time}"/> 
     </GridView> 
    </ListView.View> 
</ListView> 

Изнутри обработчика событий ListView SelectionChanged Мне нужно вызвать метод и передать ему параметр строки, принимая его от одного из поле выбранного ряда ObservableCollection ShQuCollection.

Как я могу ссылаться на ObservableCollection внутри обработчика событий ListView SelectionChanged?

private void ShSelList_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     ...????? 
    } 

Edited (добавлено):

Мой ObservableCollection в файл кода другого окна, и я использую Window.Resources декларацию, чтобы достичь ее.

<Window.Resources> 
    <c:ShWindow x:Key="myDataSource"/> 
</Window.Resources> 

И ObservableCollection выглядит следующим образом:

 ObservableCollection<ShsQu> _ShQuCollection = 
      new ObservableCollection<ShsQu>(); 

    public ObservableCollection<ShsQu> ShQuCollection 
    { get { return _ShQuCollection; } } 

    public class ShsQu 
    { 
     public string StrCode { get; set; } 
     public string Date { get; set; } 
     public string Time { get; set; } 
    } 

ответ

1

Я предполагаю, что ваш видовую прилагается к вашему View. Значение ShQuCollection должно быть общедоступным в вашем ModelView. Вам просто нужно получить доступ к ObservableCollection через ваш ModelView.

Update:

Достигнуть запись, в которой вам необходимо изменить вы захватить текущую SelectedIndex от вашего ListView.

private void ShSelList_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    string s = ShQuCollection[ShSelList.SelectedIndex].StrCode; 
} 

Примечание: Было бы чище в будущем использовать MVVM подход.

+0

К сожалению, я еще недостаточно изучил MVVM, и моя коллекция находится в файле с кодом в окне. Есть ли выход в этом случае? – rem

+0

Можете ли вы обновить свой вопрос, чтобы включить код, в котором вы объявляете свой ObservableCollection? – jsmith

+0

Я включил в мой обновленный вопрос, объявляющий мою коллекцию. И еще одно замечание: мне не нужно просто ссылаться на мою коллекцию из обработчика событий, но достичь этой записи, которая теперь будет выбрана после SelectionChanged. – rem

0

В вашем коде позади вы должны использовать свойство выбранного элемента listview (SsSelList) для объекта ShsQu и обращаться к свойствам этого объекта, чтобы вызвать ваш метод.

ShSQu obj = SsSelList.SelectedItem as ShSQu; 
// Then call the method using the object properties 
MethodToCall(obj.StrCode); 

Это должно работать, однако, не очень чистый способ сделать это, и я рекомендовал бы использовать шаблон MVVM. Если вы использовали MVVM, вы сохранили бы свою коллекцию в viewmodel и отслеживали текущий элемент в модели viewmodel. Таким образом, любая команда, созданная в модели viewmodel, может получить доступ к текущему элементу.

Джош Смит дает хорошее представление здесь (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx) MVVM, если вам интересно читать дальше.

+0

Спасибо за ссылку, я обязательно узнаю эту важную вещь К сожалению, я не могу выполнить кастинг в соответствии с вашим примером. Он просто не компилируется в моем коде, возможно, что-то не хватает – rem

+0

Извините, что это было глупо, объект является ключевым словом и не должен использоваться для изменения имени переменной объект имени переменной для obj – mattythomas2000