如何从WPF ListView SelectionChanged事件处理程序引用ObservableCollection?

时间:2010-01-08 16:39:57

标签: c# wpf parameters event-handling observablecollection

在WPF应用程序中,我有一个ListView,它通过数据绑定与ObservableCollection ShQuCollection连接:

<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的选定行的一个字段中获取它。

如何从ListView SelectionChanged事件处理程序中引用ObservableCollection?

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

已编辑(已添加):

My 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; }
    }

2 个答案:

答案 0 :(得分:1)

我假设您的 ModelView 已附加到您的视图中。含义ShQuCollection应该是 ModelView 中的公共属性。您只需通过 ModelView 访问ObservableCollection

<强>更新

要获取需要修改的记录,请从listView中获取当前selectedIndex。

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

注意:将来使用MVVM方法会更清晰。

答案 1 :(得分: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中引发的任何命令都可以访问当前项。

如果您有兴趣进一步阅读,Josh Smith会在MVVM中给出一个很好的介绍(http://msdn.microsoft.com/en-us/magazine/dd419663.aspx)。