Xamarin с использованием привязки INotifyPropertyChanged с Entry и Label и MVVM - PullRequest
0 голосов
/ 15 апреля 2020

Я получаю строку с намерением в MainActivity.cs проекта Android. Я использую Sharedproject. Строка является штрих-кодом, который обновляется намерением, если штрих-код сканируется. Я хочу показать строку штрих-кода в записи или метке .xaml-файла с помощью привязки данных.

Проблема заключается в том, что штрих-код only обновляется в записи и в метке также если я вручную нажал на запись . Как я могу убедиться, что метка или запись обновляются при изменении строки из намерения?

Код:

MainActivity.cs:

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    public static MainActivity Instance;
    myBroadcastReceiver receiver;
    BarcodeModel barcodeModel;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;

        base.OnCreate(savedInstanceState);

        // Barcode
        MainActivity.Instance = this;
        receiver = new myBroadcastReceiver();
        barcodeModel = new BarcodeModel();

        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        LoadApplication(new App());
    }
    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
    {
        Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

        base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    protected override void OnResume()
    {
        base.OnResume();
        //  Register the broadcast receiver dynamically
        RegisterReceiver(receiver, new IntentFilter(Resources.GetString(Resource.String.activity_intent_filter_action)));
    }

    protected override void OnPause()
    {
        base.OnPause();
        UnregisterReceiver(receiver);
    }

    public void DisplayResult(Intent intent)
    {
        //  Output the scanned barcode to ViewModel
        barcodeModel.decodedData = intent.GetStringExtra(Resources.GetString(Resource.String.datawedge_intent_key_data));


    }
}

//  Broadcast receiver to receive scanned data
[BroadcastReceiver(Enabled = true)]
public class myBroadcastReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        String action = intent.Action;
        if (action.Equals(MainActivity.Instance.Resources.GetString(Resource.String.activity_intent_filter_action)))
        {
            //  A barcode has been scanned
            MainActivity.Instance.RunOnUiThread(() => MainActivity.Instance.DisplayResult(intent));
        }
    }

}

}

ViewModel:

 public class BarcodeModel : INotifyPropertyChanged
{
    private string data;
    public event PropertyChangedEventHandler PropertyChanged;

    public BarcodeModel()
    {

    }

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    public string decodedData
    {
        get { return data; }
        set { data = value; OnPropertyChanged(); }
    }

ContentPage:

        <Label Text="{Binding decodedData}"
                   HorizontalOptions="StartAndExpand"
                   VerticalOptions="Center"
                   TextColor="Accent"/>

        <Entry Keyboard="Text"
                   Placeholder="No Object selected"
                   VerticalOptions="Center"
                   HorizontalOptions="StartAndExpand"
                   x:Name="eintrag"
                   Text="{Binding decodedData}"/>

BindingContext в .xaml.cs: BindingContext = new BarcodeModel();

1 Ответ

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

Модель, которую вы изменяете в проекте Android, отличается от модели bindingContext, поэтому она не работает.

Решение :

Использование MessagingCenter для отправки модели из вашего проекта Android в ваш общий проект и обновления там модели:

В проекте Android отправляйте сообщение при каждом сканировании штрих-кода:

public void DisplayResult(Intent intent)
{
    //  Output the scanned barcode to ViewModel
    barcodeModel.decodedData = intent.GetStringExtra(Resources.GetString(Resource.String.datawedge_intent_key_data));
    barcodeModel.decodedData = "test";

    MessagingCenter.Send<object, BarcodeModel>(new object(), "barCodeScanned", barcodeModel);
}

В общем проекте подпишитесь на это сообщение и обновите модель:

public partial class MainPage : ContentPage
{
    BarcodeModel barCodeModel;

    public MainPage()
    {
        InitializeComponent();

        barCodeModel = new BarcodeModel();
        barCodeModel.decodedData = "defaultValue";
        this.BindingContext = barCodeModel;

        MessagingCenter.Subscribe<object, BarcodeModel>(new object(), "barCodeScanned", (sender, arg) =>
        {
            BarcodeModel tempbarCodeModel = arg as BarcodeModel;
            barCodeModel.decodedData = tempbarCodeModel.decodedData;
        });
    }
}

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

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