Xamarin Forms - обязательное свойство не найдено - PullRequest
0 голосов
/ 25 апреля 2020

Я следую этому руководству по созданию моделей и ContentViews, но у меня возникают ошибки, когда я пытаюсь настроить некоторые имена классов и шаблоны, чтобы они больше соответствовали проекту, который я делаю.

Если я скопирую код точно из учебника, он будет работать нормально. Я думаю, что есть что-то настолько маленькое, что мне здесь не хватает, но я просканировал свой код более часа, и все выглядит хорошо.

Я получаю ошибку от MainPage, 2 выпуска

[0:] Binding: 'SelectedItem' property not found on 'testProject_xamarin.MainPage', target property: 'Xamarin.Forms.ListView.SelectedItem'
[0:] Binding: 'listBands' property not found on 'testProject_xamarin.MainPage', target property: 'Xamarin.Forms.ListView.ItemsSource'

У меня есть простой Band C# class ...

public class Band
{

    public string Name { get; set; }
    public string Genre { get; set; }
    public string Description { get; set; }

}

BandViewModel. cs

public class BandViewModel
{

    public IList<Band> listBands { get; set; }

    public object SelectedItem { get; set; }

    public BandViewModel()
    {
        listBands = new List<Band>();
        GenerateBandModel();
    }

    private void GenerateBandModel()
    {
        string name = "Test";
        string genre = "Music";
        string description = "Description";
        var band = new Band()
        {
            Name = name,
            Description = description,
            Genre = genre
        };
        listBands.Add(band);
    }
}

Вот мой BandViewTemplate.xaml


<ContentView 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="testProject_xamarin.Templates.BandViewTemplate">
  <ContentView.Content>
        <Frame IsClippedToBounds="True"
               HasShadow="True"
               Padding="0"
               BackgroundColor="White">
            <Frame.Margin>
                <OnPlatform x:TypeArguments="Thickness"  
                     Android="10"   
                     iOS="10"/>
            </Frame.Margin>
            <StackLayout Orientation="Horizontal">
                <BoxView Color="Green" WidthRequest="6"/>
                <Grid VerticalOptions="CenterAndExpand"  
                 Padding="0"  
                 HorizontalOptions="FillAndExpand"  
                 BackgroundColor="Transparent">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <Label FontAttributes="Bold"  
                   Grid.Row="0"  
                   HorizontalTextAlignment="Start"  
                   VerticalTextAlignment="Center"  
                   FontSize="16"  
                   Text="{Binding Name, Mode = TwoWay}">
                        <Label.LineBreakMode>
                            <OnPlatform x:TypeArguments="LineBreakMode"  
                          Android="NoWrap"   
                          iOS="TailTruncation"/>
                        </Label.LineBreakMode>
                    </Label>
                    <BoxView Grid.Row="1" Color="Gray"  
                    HorizontalOptions="FillAndExpand"  
                    HeightRequest="1"/>
                    <Grid Grid.Row="2"  
                   BackgroundColor="Transparent"  
                   Padding="4">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>
                        <Label Grid.Row="0"  
                          Grid.Column="0"  
                          Text="User Age"/>
                        <Label Grid.Row="0"  
                          Grid.Column="1"  
                          Text="{Binding Description, Mode = TwoWay}"/>
                    </Grid>
                </Grid>
            </StackLayout>
        </Frame>
    </ContentView.Content>
</ContentView>

И, наконец, MainPage.xaml .. Именно здесь выдается ошибка.


<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:bandit_xamarin.Templates"
             x:Class="testProject_xamarin.MainPage">

    <StackLayout Orientation="Vertical">
        <!-- Place new controls here -->
        <Label Text="Welcome to Xamarin.Forms!" 
           FontAttributes="Bold"  
               FontSize="Medium"  
               VerticalOptions="Start"  
               HorizontalTextAlignment="Center"  
               VerticalTextAlignment="Center"  
               BackgroundColor="Transparent"  
               HorizontalOptions="CenterAndExpand" />
        <ListView x:Name="listView"
                  SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
                  HasUnevenRows="True"
                  ItemsSource="{Binding listBands}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <local:BandViewTemplate/>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>

</ContentPage>

MainPage.xaml.cs

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
        this.BindingContext = new BandViewModel();
    }
}

1 Ответ

0 голосов
/ 26 апреля 2020

Я проверяю ваш код на моей стороне, но у меня нет проблем, это ссылка о моем проекте, вы можете скачать его и протестировать его.

https://github.com/CherryBu/ContentViewSample

По поводу вашего кода, у меня есть несколько предложений, вы можете обратиться к нему.

Во-первых, я предлагаю вам заменить List () с помощью ObservableCollection () , потому что он наследует Интерфейс INotifyPropertyChanged представляет динамический сбор данных c, который предоставляет уведомления при добавлении, удалении элементов или обновлении всего списка.

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

Я изменяю ваш код, пожалуйста, посмотрите:

  public class BandViewModel: INotifyPropertyChanged
{
    public IList<Band> listBands { get; set; }
    private object _SelectedItem;
    public object SelectedItem
    {
        get { return _SelectedItem; }
        set
        {
            _SelectedItem = value;
            RaisePropertyChanged("SelectedItem");
        }
    }
    public BandViewModel()
    {
        listBands = new List<Band>(); 

        GenerateBandModel();
        //SelectedItem = listBands[0];
    }

    private void GenerateBandModel()
    {
        string name = "Test";
        string genre = "Music";
        string description = "Description";

        for(int i=0;i<10;i++)
        {
            var band = new Band()
            {
                Name = name + " "+i,
                Description = description+ " " +i,
                Genre = genre
            };
            listBands.Add(band);
        }

    }


    public event PropertyChangedEventHandler PropertyChanged;     
    public void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...