1

当单击a 的元素时,我正在尝试捕获和处理事件UITableViewSource
这是我的代码:

    public class TableViewSource : UITableViewSource
    {
        public event EventHandler<SongSelectedEventArgs> SongSelected;
        private List<Song> rows;

        public TableViewSource (List<Song> list) 
        { 
            rows = list; 
        }

        public override int RowsInSection (UITableView tableview, int section) 
        { 
            return rows.Count; 
        }

        public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
        {
            // raise our event
            var handler = SongSelected;
            if (handler != null)
                handler (this, new SongSelectedEventArgs (rows[indexPath.Row]));
        }

        public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
        {  
            UITableViewCell cell = new UITableViewCell(UITableViewCellStyle.Default,"mycell"); 
            cell.TextLabel.Text = rows[indexPath.Row].ToString();
            return cell;
        }

        public class SongSelectedEventArgs : EventArgs
        {
            public Song Group { get; set; }
            public SongSelectedEventArgs(Song group) : base()
            { Group = group; }
        }
    }

我正在从 Xamarin 的示例中建模,这里:

    protected class AssetGroupTableSource : UITableViewSource
    {
        public event EventHandler<GroupSelectedEventArgs> GroupSelected;
        protected List<ALAssetsGroup> groups;

        public AssetGroupTableSource(List<ALAssetsGroup> groups) { this.groups = groups; }

        public override int NumberOfSections (UITableView tableView) { return 1; }

        public override int RowsInSection (UITableView tableview, int section) { return groups.Count; }

        public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
        {
            UITableViewCell cell = tableView.DequeueReusableCell ("AlbumCell");
            if(cell == null)
                cell = new UITableViewCell (UITableViewCellStyle.Default, "AlbumCell");
            cell.TextLabel.Text = groups[indexPath.Row].Name;
            return cell;
        }

        public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
        {
            // raise our event
            var handler = GroupSelected;
            if (handler != null)
                handler (this, new GroupSelectedEventArgs (groups[indexPath.Row]));
        }

        public class GroupSelectedEventArgs : EventArgs
        {
            public ALAssetsGroup Group { get; set; }
            public GroupSelectedEventArgs(ALAssetsGroup group) : base()
            { Group = group; }
        }
    }

当我在表格视图中单击一个元素(类Song)时,它成功地转到了覆盖RowSelected。然而,handler总是null。我在做什么与导致此失败的示例代码不同?

编辑:这是应该读取事件的行(但没有触发):

    TableViewSource tableData = new TableViewSource(results);

        tableData.SongSelected += (object sender, TableViewSource.SongSelectedEventArgs e) => {
            //AssetEnumerationScreen assetScreen = new AssetEnumerationScreen (e.Group.Name, assetGroups[e.Group]);
            //NavigationController.PushViewController (assetScreen, true);
            Console.WriteLine("Test");
        };

编辑:这是大部分主体代码:

    TableViewSource tableData = new TableViewSource(results);

        tableData.SongSelected += (object sender, TableViewSource.SongSelectedEventArgs e) => {
            Console.WriteLine("Test");
        };

        tableData.SongSelected += delegate(object sender, TableViewSource.SongSelectedEventArgs e) {
            Console.WriteLine("Test");
            LyricsScreen assetScreen = new LyricsScreen (e.Song);
            NavigationController.PushViewController (assetScreen, true);
        };
        searchBool.ValueChanged += (sender, e) => {
            UpdateDisplay(tableData, songList);
        };
        lyricSearch.TextChanged += (sender, e) => {
            UpdateDisplay(tableData, songList);
        };

        lyricSearch.Text = String.Empty;

        this.searchResults.Source = tableData;

编辑!:我发现了错误。我有这条线:

    tableData = new TableViewSource(results);

两次,所以它订阅了第一个事件,但后来我创建了一个新的并将那个设置为源,用订阅覆盖了那个。

谢谢!

4

0 回答 0