繁体   English   中英

Xamarin.Forms - 如何使用 ObservableCollection 从包含 ListView 中选择项目

[英]Xamarin.Forms - How to select item from its containing ListView with ObservableCollection

如图所示,我有一个绑定到ObservableCollection<ItemID>ListView 当我单击删除按钮时,它会正确调用DeleteButton_Clicked ,但随后无法访问对象。 我需要删除对象,然后更改Scan.Text属性。 感谢您的任何帮助。

列出项目

ItemID类在此处定义:

public class ItemID
{
    public string Name { get; set; }
    public string Age { get; set; }
    public double Value { get; set; }
}

这是给我带来麻烦的代码:

private void DeleteButton_Clicked(object sender, EventArgs e)
{
    ItemID items = MyList.SelectedItem as ItemID;
        
    Items.Remove(items);
    MyList.SelectedItem = null;
    Scan.Text = items.Value.ToString(); // it doesn't work
}

Scan 按钮创建一个对象并更改 Scan.Text:

private async void ButtonScanDefault_Clicked(object sender, EventArgs e)
{
    ZXingScannerPage scanPage;
    scanPage = new ZXingScannerPage();

    scanPage.OnScanResult += (result) =>
    {
        scanPage.IsScanning = false;

        Device.BeginInvokeOnMainThread(async () =>
        {
            await Navigation.PopModalAsync();
            await DisplayAlert("Scanned Barcode", result.Text, "OK");


            Scan.Text = SumCost(Cost_Product(result.Text));

            var item = new ItemID()
            {
                Name = "Name_ID:" + " " + result.Text,
                Age = "Age:" + " " + Cost_Product(result.Text),
                Value = Cost_Product(result.Text)
            };
            Items.Add(item);

        });
    };
    await Navigation.PushModalAsync(scanPage);
}

XAML

<ListView Grid.Row="1"
            ItemsSource="{Binding Items}"
            HasUnevenRows="True"
            x:Name="MyList">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <Grid Margin="10">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <Label Text="{Binding Name}" />

                    <Button Clicked="DeleteButton_Clicked"
                            Grid.Column="1"
                            Padding="30,10"
                            Text="Delete"
                            HorizontalOptions="EndAndExpand"
                            BackgroundColor="Black"
                            TextColor="White" />
                </Grid>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

这可能是问题所在:在您的DeleteButton_Clicked中,您依赖MyListSelectedItem属性。 但是,单击“删除”按钮不会自动选择该列表项。 确定要删除的正确项目的方法是查看发送删除单击的按钮的BindingContext属性,并将此对象转换为ItemID

private void DeleteButton_Clicked(object sender, EventArgs e)
{
    // The sender is the button you clicked
    Button button = (Button)sender;

    // The binding context of the button IS the
    // item associated with the button.
    ItemID item = (ItemID)button.BindingContext;
    Items.Remove(item);

    // Now you can adjust the Scan.Text however you want.
    // THIS IS JUST AN EXAMPLE
    ItemID defaultScanItem = Items.FirstOrDefault();
    if (defaultScanItem == null)
    {
        Scan.Text = $"[Deleted {item.Name}]";
    }
    else
    {
        Scan.Text = $"[Deleted {item.Name}] Scan {defaultScanItem.Name}";
    }
}

删除前后

删除前后

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM