Как go на предыдущую страницу без обновления / перезагрузки в формах xamarin - PullRequest
0 голосов
/ 05 мая 2020

Итак, у меня есть ListView на странице A, когда я нажимаю кнопку, он перенаправляет меня на страницу B, теперь я что-то делаю на странице B, но когда я нажимаю Ok / Submit, мне нужно передать эти данные на страницу A а также загружать PageA без обновления или перезагрузки, что в конечном итоге приведет к обновлению ListView / PageA. Каждое обновление на PageB - это в основном некоторое обновление содержимого для каждой плитки ListView на PageA, поэтому в основном, когда я нажимаю на первый элемент и возвращаюсь, он должен только обновить этот элемент

Я смог сделать это с помощью MessagingCenter, чтобы подписаться на PageA и использовать словарь для отправки данных обратно на PageB, но если я использую Navigation.PopAsyn c, он просто обновляет данные на странице A

Любое жизнеспособное решение для этого, так как это обычная функция, которая есть в любом приложении, но я по какой-то причине не могу ее визуализировать

это мой код PageB

 var data = new Dictionary<string, string>();
                data.Add("1", "1");
                data.Add("2","2");
                data.Add("3", "3");
                data.Add("4", "4");
                data.Add("5", "5");
                MessagingCenter.Send(data, "SubmitData");
                Navigation.PopAsync();

Кодовая страница A

 MessagingCenter.Subscribe<Dictionary<string, string>>(this, "SubmitData", (sender) =>
         {
             try
             {
                 sender.TryGetValue("1", out result[0]);
                 sender.TryGetValue("2", out result[1]);
                 sender.TryGetValue("3", out result[2]);
                 sender.TryGetValue("4", out result[3]);
                 sender.TryGetValue("5", out result[4]);
             }

любая помощь приветствуется

1 Ответ

0 голосов
/ 06 мая 2020

, но когда я нажимаю Ok / Submit, мне нужно передать эти данные на PageA, а также загрузить PageA без обновления или перезагрузки, что в конечном итоге приведет к обновлению ListView / PageA. Каждое обновление на PageB - это, в основном, обновление содержимого для каждая плитка ListView на PageA, поэтому в основном, когда я нажимаю на первый элемент и возвращаюсь, он должен обновлять только этот элемент

Согласно вашему описанию, я предполагаю, что вы хотите выбрать один элемент из ListView на странице A, затем передайте выбранный элемент на страницу B, внесите некоторые изменения и go обратно на страницу A и обновите этот элемент в ListView, я прав?

Если да, я предлагаю вам взглянуть на следующий код:

PageA:

 <StackLayout>
        <ListView
            x:Name="listview1"
            ItemsSource="{Binding list}"
            SelectedItem="{Binding selecteditem}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout>
                            <Label Text="{Binding username}" />
                            <Label Text="{Binding age}" />
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

        <Button
            x:Name="btn1"
            Clicked="btn1_Clicked"
            Text="redirect to another page" />
    </StackLayout>

 public partial class Page8 : ContentPage
{
    public viewmodel3 viewmodel { get; set; }
    public Page8()
    {
        viewmodel = new viewmodel3();

        InitializeComponent();

        this.BindingContext = viewmodel;
    }

    private void btn1_Clicked(object sender, EventArgs e)
    {
        Navigation.PushAsync(new Page9(viewmodel.selecteditem));
    }     
}

public class viewmodel3:ViewModelBase
{
    public ObservableCollection<model3> list { get; set; }
    private model3 _selecteditem;
    public model3 selecteditem
    {
        get { return _selecteditem; }
        set
        {
            _selecteditem = value;
            RaisePropertyChanged("selecteditem");

        }
    }

    public viewmodel3()
    {
        list = new ObservableCollection<model3>()
        {
            new model3(){username="cherry",age=29},
            new model3(){username="barry",age=32},
            new model3(){username="wendy",age=27}
        };
        MessagingCenter.Subscribe<model3>(this, "Update", (person) =>
        {

            updateitem(person);
        });

    }
    private void updateitem(model3 item)
    {
        var person = list.FirstOrDefault(p => p.username == item.username);
        if (person != null)
        {
            person.age = item.age;
        }
    }      
}
public class model3:ViewModelBase
{
    private string _username;
    public string username
    {
        get { return _username; }
        set
        {
            _username = value;
            RaisePropertyChanged("username");
        }
    }
    private int _age;
    public int age
    {
        get { return _age; }
        set
        {
            _age = value;
            RaisePropertyChanged("age");
        }
    }
}

PageB:

 <StackLayout>
        <Entry x:Name="username" />
        <Entry x:Name="age" />

        <Button
            x:Name="btnsub"
            Clicked="btnsub_Clicked"
            Text="submit" />
    </StackLayout>

 public partial class Page9 : ContentPage
{
    public model3 item;
    public Page9(model3 m)
    {
        InitializeComponent();
        item = new model3();

        item.username = m.username;
        item.age = m.age;

        username.Text = m.username;
        age.Text = m.age.ToString();
    }

    private void btnsub_Clicked(object sender, EventArgs e)
    {
         if(item.username!=username.Text || item.age!=int.Parse(age.Text))
        {
            MessagingCenter.Send(new model3() { username = username.Text, age = int.Parse(age.Text) }, "Update");
        }
        Navigation.PopAsync();

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