Xamarin绑定用于列表中的动态创建按钮

时间:2018-09-21 13:56:08

标签: c# xamarin mvvm data-binding xamarin.forms

在ViewModel中,我从数据库中获取数据,并将一些数据写入字符串列表中。完成后,我在后面的代码中创建按钮。
现在,我想绑定这些按钮中的每个按钮,以便在单击按钮时可以在ViewModel中进行操作。
使用以下代码,应该更清楚我想做什么以及如何达到目标。

在ViewModel中,我有一个LoadData()方法:

public List<string> Items { get; set; }

private async Task<bool> LoadData()
{
    Items = new List<string>();
    var data = await getData.Load();

    foreach(var item in data)
    {
        Items.Add(item);
    }

    ItemsLoaded?.Invoke(this);
}

完成后,我在后面的代码中调用一个方法,该方法将创建包含以下各项的按钮:

viewModel.ItemsLoaded += AddItemsToUi;

private void AddItemsToUi(MainPageViewModel vm)
{
    foreach (var item in vm.Items)
    {
        var button = new Button
        {
            Text = item,
            TextColor = Color.White
        }
    }
}

代码已大大缩短并匿名化了,但我希望我想清楚地做些什么。

假设我要更改红色单击的按钮的TextColor以及蓝色更改的其他按钮TextColor。 我以为可以通过某种绑定来做到这一点,但是我什至不知道真正从哪里开始。我需要可以以某种方式识别的绑定。这可能吗?

由于可能存在重复而进行编辑:重复的问题只需要一个普通的绑定即可。我的问题是,我需要在循环中添加绑定,但是仍然想以某种方式标识每个绑定的项目。我不知道这是正确的方法,还是我需要其他不同的东西,因为那是不可能的。

1 个答案:

答案 0 :(得分:2)

在下面的代码中尝试单击事件的句柄,并在页面消失时获得释放。

 Button button;
    private void AddItemsToUi(MainPageViewModel vm)
    {
        foreach (var item in vm.Items)
        {
            button = new Button
            {
                Text = item,
                TextColor = Color.White
            };                
            button.Clicked += Button_Clicked;
        }
    }

    private void Button_Clicked(object sender, EventArgs e)
    {
        var button = (sender as Button);
        button.BackgroundColor = Color.Red;
    }
    protected override void OnDisappearing()
    {
        button.Clicked -= Button_Clicked;
        base.OnDisappearing();
    }