【问题标题】:WPF - Get bound source object from ListView.SelectedItemWPF - 从 ListView.SelectedItem 获取绑定的源对象
【发布时间】:2019-10-12 06:53:00
【问题描述】:

我有一个绑定到List<MyObject> 集合的ListView 项目。 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();
}

如何获得由ListView.SelectedItem 表示的MyObject 的实际实例? 感谢您的帮助。

【问题讨论】:

    标签: c# wpf listview data-binding


    【解决方案1】:

    我已多次阅读您的问题。在我看来,您将 MVVM 和普通后端编码混合在一起,这使您的代码难以阅读和理解。

    我相信有两种方法可以访问该对象。如果我得到你正确的要求。你可以投:

    MyObject currentItem = lvMyListView.SelectedItem as MyObject; 
    

    或在您的原始列表中使用lvMyListView.SelectedIndex

    另请注意,如果未选中,第一个选项可以是 null,第二个选项可以是 -1,因此请相应添加检查。

    但是,更好的方法是同时使用 MVVM 和数据绑定。它比我在这里写的要长,但是您创建了一个视图模型对象并将列表的选定项属性绑定到它的属性之一,您的按钮也会触发视图模型类中的操作。这是 WPF 编码的更好方法。所以请检查一下。

    【讨论】:

    • 您好,感谢您的详细回答。你是指BindingExpressions还是Commands
    • 是的,我愿意。这些是实现称为 MVVM 的架构方法的语法。这样,您无需在 MyWindow.cs 文件中编写逻辑,而是创建一个 ViewModel 类,并且无论用户界面如何,逻辑都在那里实现。然后将 UI 绑定到 VM。这是非常简短的描述,但可以为您提供从哪里开始的提示。希望对你有帮助
    【解决方案2】:
                //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();
    

    【讨论】:

      猜你喜欢
      • 2014-02-25
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多