Xamarin: обязательное свойство не найдено - PullRequest
0 голосов
/ 13 июня 2018

Это приложение прекрасно работает в UWP.Я вырвал все, кроме одного из основных свойств, которое не работает на Android.Это выглядит так:

MyPage.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:ViewModels="clr-namespace:MyApp.ViewModels"
             x:Class="MyApp.Views.MyApp">
    <ContentPage.BindingContext>
        <ViewModels:MyViewModel />
    </ContentPage.BindingContext>
    <ContentPage.Content>
        <ScrollView>

            <StackLayout Style="{StaticResource PageForm}">

                <Picker ItemsSource="{Binding Modes}"
                    ItemDisplayBinding="{Binding Value}"
                    SelectedItem="{Binding SelectedMode}" />

            </StackLayout>

        </ScrollView>

   </ContentPage.Content>
</ContentPage>

MyPage.cs

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

namespace MyApp.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class MyApp : ContentPage
    {
        public MyApp ()
        {
            InitializeComponent ();
        }
    }
}

MyViewModel.cs

using MyApp.Models;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
namespace MyApp.ViewModels
{
    public class MyViewModel: INotifyPropertyChanged
    {
        List<Mode> _modes;
        Mode _selectedMode;

        public event PropertyChangedEventHandler PropertyChanged;

        public MyViewModel()
        {
            Modes = new List<Mode>()
            {
                new Mode() { Key=ModeType.Mode1, Value="Mode1" },
                new Mode() { Key=ModeType.Mode2, Value="Mode2" }
            };
            SelectedMode = Modes.Single(m => m.Key == ModeType.Mode1);
        }

        public List<Mode> Modes {
            get { return _modes; }
            set {
                _modes = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Modes"));
            }
        }

        public Mode SelectedMode {
            get {
                return _selectedMode;
            }
            set {
                _selectedMode = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("SelectedMode"));
            }
        }

    }
}

Mode.cs

namespace MyApp.Models
{
    public enum ModeType { Mode1, Mode2 };
    public class Mode
    {
        public ModeType _key;
        public string _value;
        public ModeType Key {
            get
            {
                return _key;
            }
            set
            {
                _key = value;
            }
        }
        public string Value {
            get
            {
                return _value;
            }
            set
            {
                _value = value;
            }
        }
    }
}

, и в консоли отладки я вижу

[0:] Binding: 'Value' property not found on 'MyApp.Models.Mode', target property: 'Xamarin.Forms.Picker.Display'

[0:] Binding: 'Value' property not found on 'MyApp.Models.Mode', target property: 'Xamarin.Forms.Picker.Display'

[0:] Binding: 'SelectedMode' property not found on 'MyApp.ViewModels.'MyApp', target property: 'Xamarin.Forms.Picker.SelectedItem'

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

Остальная часть модели представления фактически работает.Основная часть приложения работает, я даже могу запустить код на этой модели представления.Если я создам простую привязку строк, которая будет работать даже на Android.

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

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

В вашем классе модели режима также необходимо реализовать INotifyPropertyChanged

0 голосов
/ 14 июня 2018

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

Anroid Project File > Properties > Linking > Set to None.

Он все еще не работал, поэтому я закрыл Visual Studio и удалил каталоги bin и obj впроекты PCL и Android.Наконец-то это сработало.

Еще одна вещь заключается в том, что теперь я потерял возможность устанавливать ссылки на sdk и пользовательские сборки.Что если в какой-то момент мне это понадобится?

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