【问题标题】:How to reference ObservableCollection from WPF ListView SelectionChanged event handler?如何从 WPF ListView SelectionChanged 事件处理程序中引用 ObservableCollection?
【发布时间】:2010-02-03 11:03:16
【问题描述】:

在 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)
    {
        ...?????
    }

已编辑(添加):

我的 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; }
    }

【问题讨论】:

    标签: c# wpf parameters event-handling observablecollection


    【解决方案1】:

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

    更新:

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

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

    注意:将来使用 MVVM 方法会更干净。

    【讨论】:

    • 不幸的是,我对 MVVM 的学习还不够,而且我的收藏在窗口的代码隐藏文件中。这种情况有出路吗?
    • 您能否更新您的问题以包含您声明 ObservableCollection 的代码?
    • 我已在我更新的问题中加入了我的收藏声明。需要注意的一件事:我不需要简单地从事件处理程序中引用我的集合,而是在 SelectionChanged 之后到达现在选择的记录。
    • 是的,它有效。我只需添加对窗口的引用并将结果分配给字符串变量:“string str = sw.ShQuCollection[ShSelList.SelectedIndex].StrCode;”然后使用“str”作为参数。非常感谢!我保证将来会使用 MVVM,当我准备好时 :)
    【解决方案2】:

    在您后面的代码中,您应该能够将列表视图 (SsSelList) 的选定项属性转换为 ShsQu 对象并访问该对象的属性以调用您的方法。

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

    这应该可行,但不是一种非常干净的方法,我建议使用 MVVM 模式。如果您使用的是 MVVM,您会将您的集合存储在视图模型中并跟踪视图模型中的当前项目。这样,在视图模型中引发的任何命令都可以访问当前项目。

    如果您有兴趣进一步阅读,Josh Smith 在这里 (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx) 对 MVVM 进行了很好的介绍。

    【讨论】:

    • 谢谢你的链接,我一定会学到这个重要的东西。不幸的是,我不能按照你的例子进行铸造。它只是没有在我的代码中编译,可能缺少一些东西
    • 对不起,我很傻,object 是一个关键字,不应该用于变量名将变量名 object 更改为 obj
    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    相关资源
    最近更新 更多