Xamarin MVVM Справочный контент Просмотр и передача параметров тоже - PullRequest
0 голосов
/ 20 февраля 2020

Работа в формах ксамарина. Как я могу сослаться на представление контента со страницы контента, но также включить передачу информации, как показано ниже?

await Navigation.PushAsync(new SecondContentPage(new NextViewModel(FirstViewModel.id)));

Я пробовал контекст привязки xaml, но не знаю, откуда go, и он сохраняет сообщая мне об ошибках в конструкторе без параметров.

xmlns:viewmodel="clr-namespace:Project.ViewModels"

       <StackLayout>
            <local:SecondContentView>
                <local:SecondContentView.BindingContext>
                    <viewmodel:NextViewModel></viewmodel:NextViewModel>
                </local:SecondContentView.BindingContext>
            </local:SecondContentView>
        </StackLayout>

Мне нужен идентификатор, переданный в основном, чтобы список мог работать в представлении содержимого. спасибо всем

Обновлено - я создал новый пример кода. Я создал одну страницу, чтобы вложить вторую страницу с ListView. Прекрасно работает, пока я не попытаюсь передать параметр с аргументами x: Arguments или в конструкторе ViewModel с первой страницы на вторую страницу.

Первая страница

**<StackLayout>

        <StackLayout>
            <Label Text="First Page Content"></Label>
        </StackLayout>

        <StackLayout>
            <local:SecondContentView>
                <local:SecondContentView.BindingContext>
                    <viewmodel:SecondViewModel>
                        <x:Arguments>102</x:Arguments>
                    </viewmodel:SecondViewModel>
                </local:SecondContentView.BindingContext>
            </local:SecondContentView>
        </StackLayout>

    </StackLayout>**

вторая страница

        <ContentView.Content>

    <StackLayout>

        <Label Text="Second Page"></Label>

        <ListView x:Name="FirstListView">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Padding="10">
                            <Label Text="{Binding pType}"></Label>
                            <Label Text="{Binding fDepartment}"></Label>
                            <Label Text="{Binding Description}"></Label>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>

        </ListView>

    </StackLayout>

</ContentView.Content>

код второй страницы позади

SecondViewModel ViewModel;

    public SecondContentView(SecondViewModel viewmodel)
    {
        InitializeComponent();

        BindingContext = ViewModel = viewmodel;

        FirstListView.ItemsSource = ViewModel.TypeList;
    }

модель просмотра второй страницы

**public List<TypeModel> TypeList;

    public SecondViewModel(int parameter)
    {
        var p = parameter;

        TypeList = new List<TypeModel>()
        {
            new TypeModel { pType = 1, Title = "First Type", Description = "First Description", Version = "9.9.9", fDepartment = 101 , Comments = "None"},
            new TypeModel { pType = 2, Title = "Second Type", Description = "Second Description", Version = "9.9.9", fDepartment = 101 , Comments = "None"},
            new TypeModel { pType = 3, Title = "Third Type", Description = "Third Description", Version = "9.9.9", fDepartment = 102 , Comments = "None"},
            new TypeModel { pType = 4, Title = "Fourth Type", Description = "Fourth Description", Version = "9.9.9", fDepartment = 102 , Comments = "None"}
        };

    }**

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Мне удалось найти решение на другом издевательском примере. Ключ был x: Argument и метод переопределения.

Во-первых, если вы хотите передать значения простого типа, нам нужно явно указать его тип. Попробуйте этот формат:

<StackLayout>
    <local:SecondContentView>
        <local:SecondContentView.BindingContext>
            <local:SecondViewModel>
                <x:Arguments>
                    <x:Double>102</x:Double>
                </x:Arguments>
            </local:SecondViewModel>
        </local:SecondContentView.BindingContext>
    </local:SecondContentView>
</StackLayout>

Измените его конструктор следующим образом:

public SecondViewModel(double parameter)
{
    var p = parameter;

    TypeList = new List<TypeModel>()
    {
        new TypeModel { pType = 1, Title = "First Type", Description = "First Description", Version = "9.9.9", fDepartment = 101 , Comments = "None"},
        new TypeModel { pType = 2, Title = "Second Type", Description = "Second Description", Version = "9.9.9", fDepartment = 101 , Comments = "None"},
        new TypeModel { pType = 3, Title = "Third Type", Description = "Third Description", Version = "9.9.9", fDepartment = 102 , Comments = "None"},
        new TypeModel { pType = 4, Title = "Fourth Type", Description = "Fourth Description", Version = "9.9.9", fDepartment = 102 , Comments = "None"}
    };
}

Во-вторых, вы не передаете параметры конструктору второго представления. Вместо этого вы использовали конструктор нулевого параметра defualt и непосредственно установили его контекст привязки. Таким образом, publi c SecondContentView (viewViewdel SecondViewModel) не будет запущен. Мы можем использовать контекст привязки непосредственно во втором представлении, например:

protected override void OnBindingContextChanged()
{
    base.OnBindingContextChanged();

    ViewModel = BindingContext as SecondViewModel;
    FirstListView.ItemsSource = ViewModel.TypeList;
}
0 голосов
/ 21 февраля 2020

Вы бы просто установили BindingContext для SecondContentPage в NextViewModel.

В SecondContentPage.xaml.cs конструктор:

public SecondContentPage(NextViewModel vm)
{
    InitializeComponent();
    localVm = vm;
    BindingContext = localVm;
}

private readonly NextViewModel localVm;

Тогда вы получите доступ к свойству, где FirstViewModel.Id хранится в NextViewModel в xaml с использованием привязки. В этом примере мы скажем, что идентификатор хранился в NextViewModel.Id. Пример использования Label:

<Label Text="{Binding Id}"/>
...