gpt4 book ai didi

c# - ViewCell 中的 Xamarin.Forms 按钮。如何处理事件?

转载 作者:可可西里 更新时间:2023-11-01 08:06:33 26 4
gpt4 key购买 nike

我有一个带有按钮的自定义 ViewCell。当我单击此按钮时,我想在显示带有 ViewCell 的 ListView 的 ContentPage 中处理此单击。在 iOS 中,我会使用来自 Cell 的委托(delegate)来执行此操作。我将如何在 C#/Xamarin.Forms 中执行此操作?

这是我的自定义 ViewCell:

    public CustomCell ()
{
button = new Button ();

button.Text = "Add";
button.VerticalOptions = LayoutOptions.Center;

button.Clicked += [WHAT DO DO HERE???];

var nameLabel = new Label ();
nameLabel.SetBinding (Label.TextProperty, "name");
nameLabel.HorizontalOptions = LayoutOptions.FillAndExpand;
nameLabel.VerticalOptions = LayoutOptions.Center;

var viewLayout = new StackLayout () {
Padding = new Thickness (10, 0, 10, 0),
Orientation = StackOrientation.Horizontal,
Children = { nameLabel, button }
};

View = viewLayout;
}

我的 ContentPage 将其用作 ViewCell,如下所示:

ListView.ItemTemplate = new DataTemplate (typeof(CustomCell));

那么,我如何捕捉到按钮的按下?

请询问您是否需要澄清。


好的,所以我至少得到了这个:

这是我的内容页面:

    ...
ListView.ItemTemplate = new DataTemplate (() => new CustomCell (CustomCellButtonClicked));
}

void CustomCellButtonClicked (CustomCell m, EventArgs e)
{
//How do I get my associated object here?!

System.Diagnostics.Debug.WriteLine ("Pressed cell " + m.ToString ());
}

这是我的手机:

    public EventArgs e = null;
public event ButtonClickEvent ClickListener;
public delegate void ButtonClickEvent (AddCardCell m, EventArgs e);

public CustomCell (ButtonClickEvent Listener)
{
ClickListener += Listener;
customButton = new Button ();

customButton.Text = "Add";
customButton.VerticalOptions = LayoutOptions.Center;

customButton.Clicked += AddButtonClicked;

...
}

void AddButtonClicked (object sender, EventArgs e)
{
if (ClickListener != null) {
ClickListener (this, e);
}
}

因此,现在剩下的就是获取与单元格关联的实际对象。在ListView的ItemSelected中,是这样实现的:

ListView.ItemSelected += async (object sender, SelectedItemChangedEventArgs e) => {
var obj = (HSObject)e.SelectedItem;
};

我怎样才能做这样的事情?


明白了!这可能不是一个好的解决方案,但它似乎有效:

void CustomCellButtonClicked (CustomCell m, EventArgs e)
{
var myObject = m.BindingContext;
}

我会接受唯一的答案,因为它把我推向了正确的方向。 (而且这可能是更好的方法)。

最佳答案

如果您正在使用 View 模型或其他一些类,您可以将它传递到您的单元格中并从那里进行调用。 ListView 当前还使用 ListView 中的 ItemSelected 事件覆盖单元格上的按钮。幸运的是,他们对数据模板进行了覆盖。

private readonly ViewModel _model;
public CustomCell (ViewModel model)
{
_model = model; <--- Your DI foo
BindingContext = model; <---

button = new Button ();

button.Text = "Add";
button.VerticalOptions = LayoutOptions.Center;

button.Clicked += (sender, args) => _model.DoSomething(); <---- Your action

var nameLabel = new Label ();
nameLabel.SetBinding (Label.TextProperty, "name");
nameLabel.HorizontalOptions = LayoutOptions.FillAndExpand;
nameLabel.VerticalOptions = LayoutOptions.Center;

var viewLayout = new StackLayout () {
Padding = new Thickness (10, 0, 10, 0),
Orientation = StackOrientation.Horizontal,
Children = { nameLabel, button }
};

View = viewLayout;
}

然后您可以使用匿名函数将您的类/ View 模型传递到您的单元格中。

ListView.ItemTemplate = new DataTemplate (() => new CustomCell(viewModel));

这样您就可以从 View 单元触发您的事件,并在其他地方( View 模型)处理它。

关于c# - ViewCell 中的 Xamarin.Forms 按钮。如何处理事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25976396/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com