Xamarin Forms Сделать детальный вид редактируемым - PullRequest
0 голосов
/ 13 апреля 2020

Моя первая попытка с Xamarin, и застрял на основе c. Сборка Master-View, все работает нормально, можно добавлять новые предметы. Однако при нажатии на существующий элемент он доступен только для чтения. Я реализовал кнопку редактирования, но не знаю, как сделать элемент редактируемым в подробном представлении. Мои ItemDetailPage.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage 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="DataCollector.Views.ItemDetailPage"
             Title="{Binding Title}">

    <ContentPage.ToolbarItems>
        <ToolbarItem Text="Delete" Clicked="ToolbarItem_Clicked" />
        <ToolbarItem Text="Edit" Clicked="Edit_Clicked" />
    </ContentPage.ToolbarItems>

    <StackLayout Spacing="20" Padding="15">
        <Label Text="WTN Number:" FontSize="Medium" />
        <Label Text="{Binding Item.WTNNumber}" d:Text="Item name" FontSize="Small"/>
        <Label Text="Description:" FontSize="Medium" />
        <Label Text="{Binding Item.Description}" d:Text="Item description" FontSize="Small"/>
    </StackLayout>

</ContentPage>

и ItemDetailPage.xaml.cs

    using System;
    using System.ComponentModel;
    using Xamarin.Forms;
    using Xamarin.Forms.Xaml;

    using DataCollector.Models;
    using DataCollector.ViewModels;

    namespace DataCollector.Views
    {
        // Learn more about making custom code visible in the Xamarin.Forms previewer
        // by visiting https://aka.ms/xamarinforms-previewer
        [DesignTimeVisible(false)]
        public partial class ItemDetailPage : ContentPage
        {
            ItemDetailViewModel viewModel;

            public ItemDetailPage(ItemDetailViewModel viewModel)
            {
                InitializeComponent();

                BindingContext = this.viewModel = viewModel;
            }

            public ItemDetailPage()
            {
                InitializeComponent();

                var item = new Item
                {
                    WTNNumber = "Item 1",
                    Description = "This is an item description."
                };

                viewModel = new ItemDetailViewModel(item);
                BindingContext = viewModel;
            }

            private void Delete_Clicked(object sender, EventArgs e)
            {

            }

            private void Edit_Clicked(object sender, EventArgs e)
            {

            }
        }
    }

и ItemDetailViewModel.cs

using System;

using DataCollector.Models;

namespace DataCollector.ViewModels
{
    public class ItemDetailViewModel : BaseViewModel
    {
        public Item Item { get; set; }
        public ItemDetailViewModel(Item item = null)
        {
            Title = item?.WTNNumber;
            Item = item;
        }


    }
}

Как это сделать с помощью изменений ItemDetailViewModel?

1 Ответ

1 голос
/ 13 апреля 2020

Поскольку вы использовали MVVM. Было бы лучше обрабатывать логи c во ViewModel.

Так что вы можете улучшить это следующим образом.

в xaml

<ContentPage.ToolbarItems>
    <ToolbarItem Text="Delete" Command="{Binding DeleteCommand}"/>
    <ToolbarItem Text="Edit" Command="{Binding EditCommand}" />
</ContentPage.ToolbarItems>

в модели View

public class ItemDetailViewModel : INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    Item item;
    public Item Item {

        get {

            return item;

        }

        set
        {
            if(item!=value)
            {
                item = value;
                NotifyPropertyChanged("Item");
            }
        }

    }

    public ICommand DeleteCommand { get; set; }
    public ICommand EditCommand { get; set; }




    public ItemDetailViewModel (Item item )
    {
       var Title = item?.WTNNumber;
       Item = item;


        DeleteCommand = new Command(()=> {//... 


        });

        EditCommand = new Command(()=> {

            Item.WTNNumber = "new item";
            Item.Description = "new Description";

            // do something when click the edit button
        });

    }



}

в модели

public class Item : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }


    string wTNNumber;
    public string WTNNumber
    {

        get
        {
            return wTNNumber;
        }
        set
        {
            if (wTNNumber != value)
            {
                wTNNumber = value;
                NotifyPropertyChanged("WTNNumber");
            }
        }

    }

    string description;
    public string Description
    {

        get
        {
            return description;
        }
        set
        {
            if (description != value)
            {
                description = value;
                NotifyPropertyChanged("Description");
            }
        }

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...