Назад к основам: связывание форм Xamarin - PullRequest
0 голосов
/ 18 февраля 2019

Мне нужна помощь с основами Xamarin.Forms в Visual Studio 2017, пожалуйста.Я написал класс для хранения определенных свойств, которые я могу связать на своей странице контента.Я прочитал несколько примеров, но каждый раз я все еще не могу понять это правильно!

Когда я компилирую страницу, появляется метка

<Label 
Text="TestBinding"  
Grid.Row="0" 
Grid.Column="0" 
HorizontalOptions="Start" 
WidthRequest="100" 
VerticalOptions="Center"/>

, но

<Label 
Text="{Binding TestBinding}"  
Grid.Row="0" 
Grid.Column="1" 
HorizontalOptions="Start" 
WidthRequest="100" 
VerticalOptions="Center"/>

появляется пустым вместо текста Test binding так ясно, что я что-то не так

Пожалуйста, кто-нибудь может подсказать, что мне не хватает

Я сократил код доздесь что-то простое. Поэтому я считаю, что мой класс просмотра -

 using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using Xamarin.Forms;

namespace FitRestults_Dev1 
{
    public class AddStudentView : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        string _testtext="Test binding";
       public string TestBinding
        {
            get=> _testtext;

            set
            {
                if (string.Equals(_testtext, value))
                    return;

                _testtext = value;

                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(TestBinding)));
            }
        }
        public ObservableCollection<GradeCollection> GradeCollection { get; set; }

        public AddStudentView()
        { }
    }

}

И моя страница контента -

    <?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="FitRestults_Dev1.AddStudent"
             xmlns:local="clr-namespace:FitRestults_Dev1.AddStudentView;assembly=FitRestults_Dev1"
             BindingContext="x:local "
           >


    <ContentPage.Content>

        <StackLayout Padding="10" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
            <Grid>
                <Label Text="TestBinding "  Grid.Row="0" Grid.Column="0" HorizontalOptions="Start" WidthRequest="100" VerticalOptions="Center"/>
                <Label Text="{Binding TestBinding} "  Grid.Row="0" Grid.Column="1" HorizontalOptions="Start" WidthRequest="100" VerticalOptions="Center"/>
             </Grid>
            <Button Text="Save" HorizontalOptions="FillAndExpand" BackgroundColor="Blue" TextColor="White" Clicked="Save_Clicked" />
            <Button Text="Cancel" HorizontalOptions="FillAndExpand" BackgroundColor="Blue" TextColor="White" Clicked="Cancel_Clicked" />
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

И, наконец, за кодом страницы стоит

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace FitRestults_Dev1
{
    [XamlCompilation(XamlCompilationOptions.Compile)]


    public partial class AddStudent : ContentPage
    {
        public AddStudentView Source = new AddStudentView();
        public AddStudent ()
        {
            InitializeComponent ();
            BindingContext = Source;

        }
        async void Save_Clicked(object sender, System.EventArgs e)
        {
            var personItem = (Student)BindingContext;
            await App.Database.SaveStudentAsync(personItem);
            await Navigation.PopAsync();
        }
        async void Cancel_Clicked(object sender, System.EventArgs e)
        {
            await Navigation.PopAsync();
        }

    }

}

1 Ответ

0 голосов
/ 18 февраля 2019

Вы можете попробовать следующий код и сообщить мне, если у вас есть какие-либо проблемы с этим кодом.Спасибо.

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"
         x:Class="FitRestults_Dev1.AddStudent"
         xmlns:local="clr 
namespace:FitRestults_Dev1.AddStudentView;assembly=FitRestults_Dev1"
         BindingContext="x:local ">

<ContentPage.Content>
    <StackLayout Padding="10" HorizontalOptions="FillAndExpand" 
VerticalOptions="FillAndExpand">
        <Grid>
            <Label Text="TestBinding "  Grid.Row="0" Grid.Column="0" 
HorizontalOptions="Start" WidthRequest="100" VerticalOptions="Center"/>
            <Label Text="{Binding TestBinding} "  Grid.Row="0" Grid.Column="1" 
HorizontalOptions="Start" WidthRequest="100" VerticalOptions="Center"/>
         </Grid>
        <Button Text="Save" HorizontalOptions="FillAndExpand" BackgroundColor="Blue" 
TextColor="White" Clicked="SaveCommand" />
        <Button Text="Cancel" HorizontalOptions="FillAndExpand" 
BackgroundColor="Blue" TextColor="White" Clicked="CancelCommand" />
    </StackLayout>
</ContentPage.Content>
</ContentPage>

Xaml.cs

[XamlCompilation(XamlCompilationOptions.Compile)]

public partial class AddStudent : ContentPage
{
    public AddStudentView Source = new AddStudentView(this.Navigation);
    public AddStudent ()
    {
        InitializeComponent ();
        BindingContext = Source;

    }       
}

ViewModel:

public class AddStudentView : INotifyPropertyChanged
{
    private ICommand _navigation;
    public AddStudentView(INavigation navigation)
    {
        _navigation = naviation;
        SaveCommand = new Command(SaveCommandHandler);

        CancelCommand = new Command(CancelCommandHandler)
    }

    public string TestBinding
    {
        get {return _testBinding;}
        set
        {
            _testBinding = value;
            OnPropertyChanged();
        }
    }

    public Command SaveCommand {get;set;}

    public Command CancelCommand {get;set;}

    public void SaveCommandHandler()
    {
        var value = TestBinding

        _navigation.PopAsync();
    }

    public void CancelCommandHandler()
    {
        _navigation.PopAsync();
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...