簡體   English   中英

自定義 ViewCell 中的按鈕 Xamarin 表格視圖 C#

[英]Button in Custom ViewCell Xamarin Tableview C#

期待您的再次協助:)

我試圖讓最右邊的按鈕能夠刪除它們在 tableview 控件中的行。 現在他們現在關於他們在哪一行,但我無法將此信息連接到父級。 表格視圖填充有自定義視單元。

自定義視圖單元包含兩個不同的選擇器、兩個輸入字段和一個按鈕。 我還沒有找到一種更簡潔的方法來執行此操作,因為我擁有與數據表控件中的行數無關的選擇器數據。

目前,當您單擊右側的按鈕時,它會將選擇的行發布到控制台,但我不知道如何將其連接到其父級以便實際刪除數據表上的該行

在此處輸入圖像描述

查看后面的單元格代碼

public partial class RecipeIngredientViewCell : ViewCell
{
    ObservableCollection<clIngredient> _listIngredients = new ObservableCollection<clIngredient>();
    public ObservableCollection<clIngredient> listIngredients { get { return _listIngredients; } }

    ObservableCollection<clUnit> _listUnit = new ObservableCollection<clUnit>();
    public ObservableCollection<clUnit> funclistUnit { get { return _listUnit; } }


    clRecipeIngredient _recipeIngredient;
    int _row;

    public RecipeIngredientViewCell(clRecipeIngredient passedrecipeIngredient, ObservableCollection<clIngredient> passedlistIngredients, ObservableCollection<clUnit> passedlistUnits, int row)
    {
        InitializeComponent();

        _listIngredients = passedlistIngredients;
        _listUnit = passedlistUnits;
        _recipeIngredient = passedrecipeIngredient;

        _row = row;

        this.BindingContext = _recipeIngredient;

        //INGREDIENT PICKER
        pickerIngredient.ItemsSource = _listIngredients;
        for(int x = 0; x < _listIngredients.Count; x++)
        {
            if (_listIngredients[x].IngredientName == _recipeIngredient.IngredientName)
            {
                pickerIngredient.SelectedIndex = x;
            }
        }
        //UNIT PICKER
        pickerUnit.ItemsSource = _listUnit;
        for (int x = 0; x < _listUnit.Count; x++)
        {
            if (_listUnit[x].UnitName == _recipeIngredient.UnitName)
            {
                pickerUnit.SelectedIndex = x;
            }
        }


    }

    private void btnDeleteRecipeIngredient_Clicked(object sender, EventArgs e)
    {
        //NOT IMPLEMENTED YET!
        
        Console.WriteLine(_recipeIngredient.IngredientName + " AT ROW " + _row.ToString());
    }

    private void txtQuantity_TextChanged(object sender, TextChangedEventArgs e)
    {
        _recipeIngredient.Quantity = txtQuantity.Text.ToDouble();
    }

    private void txtComment_TextChanged(object sender, TextChangedEventArgs e)
    {
        _recipeIngredient.Comments = txtComment.Text;
    }

    private void pickerIngredient_SelectedIndexChanged(object sender, EventArgs e)
    {
        _recipeIngredient.IngredientName = pickerIngredient.SelectedItem.ToString();
    }

    private void pickerUnit_SelectedIndexChanged(object sender, EventArgs e)
    {
        _recipeIngredient.UnitName = pickerIngredient.SelectedItem.ToString();
    }
}

查看單元格 XAML

<ViewCell xmlns="http://xamarin.com/schemas/2014/forms" 
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:d="http://xamarin.com/schemas/2014/forms/design"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         mc:Ignorable="d"
         x:Class="RecipeDatabaseXamarin.Views.RecipeIngredientViewCell">

<Grid VerticalOptions="CenterAndExpand" Padding = "20, 0" >
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="75" />
    </Grid.ColumnDefinitions>
    <Picker Grid.Column = "0" x:Name="pickerIngredient" HorizontalOptions = "StartAndExpand" SelectedIndexChanged="pickerIngredient_SelectedIndexChanged"/>
    <Entry Grid.Column = "1" x:Name ="txtQuantity" HorizontalOptions = "StartAndExpand" Text = "{Binding Quantity}" TextChanged="txtQuantity_TextChanged" />
    <Picker Grid.Column = "2" x:Name ="pickerUnit" HorizontalOptions = "StartAndExpand" SelectedIndexChanged="pickerUnit_SelectedIndexChanged"/>
    <Entry Grid.Column = "3" x:Name="txtComment"  HorizontalOptions = "StartAndExpand" Text = "{Binding Comments}" TextChanged="txtComment_TextChanged" WidthRequest="150"/>
    <Button Grid.Column = "4"  x:Name="btnDeleteRecipeIngredient" HorizontalOptions = "StartAndExpand" Text = "Delete Ingredient" Clicked="btnDeleteRecipeIngredient_Clicked"/>
</Grid>

頁面代碼隱藏

        var section = new TableSection(); 
        for(int i = 0;i<_downloadedRecipeIngredients.Count;i++)
        {
            var cell = new RecipeIngredientViewCell(downloadedRecipeIngredients[i], listIngredients, listUnit, i);

            section.Add(cell);
        }
        tblData.Root.Add(section);

在后面的主頁代碼中,我希望按鈕運行一段代碼來執行諸如

            tblData.Root.del(ROW_INDEX);

謝謝!

我相信我已經解決了這個問題。 當我從第四個周末回來時將發布解決方案。

這個問題的解決方案在另一篇文章中得到解答。 基本上,一旦實現了 MVVM,解決方案就更容易了,盡管使用 listView 控件讓它在選擇器上工作很痛苦。

這個其他線程有您可以運行的示例代碼。

嘗試在 listview MVVM Xamarin 中設置選擇器

如果有人遇到同樣的問題,請發帖,我會盡力回復,因為這個問題很痛苦!!!!

我不是一個臭名昭著的 xamarin 程序員,但你有你的自動寬度,這很可能會在寬度改變的那一刻改變整個網格。 因此,它也會以不同的方式對齊按鈕。

看來您可以將水平選項 position 設置為“結束”以至少將按鈕放在屏幕的末尾。 如果你想讓它總是一樣的,我會給它們每節一定的寬度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM