Метод доступа из другого класса в Xamarin - PullRequest
0 голосов
/ 12 октября 2018

Я застрял с проблемой Xamarin.У меня есть файл XAML ContentPage, который состоит из двух ContentView (vm :) в StackLayout:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
            xmlns:local="clr-namespace:Proj1"
            xmlns:vm="clr-namespace:Proj1.ViewModels"
            x:Class="Proj1.MyMain">

    <StackLayout BackgroundColor="{StaticResource MainBG}" Spacing="1">
        <vm:DisplayArea />
        <vm:ButtonArea />
    </StackLayout> 
</ContentPage>

Два vm: представляет две области ContentView для меток и кнопок.Я разделил их для простоты и уменьшения размера файлов XAML.

Итак, общая структура объединенная XAML выглядит следующим образом:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
            xmlns:local="clr-namespace:Proj1"
            xmlns:vm="clr-namespace:Proj1.ViewModels"
            x:Class="Proj1.MyMain">

    <StackLayout BackgroundColor="{StaticResource MainBG}" Spacing="1">
        <ContentView>
            ...
            <Label Grid.Row="0" Grid.Column="1" x:Name="InpRegX" />
            ...
        </ContentView>

        <ContentView>
            ...
            <Button ... Clicked="BtnClicked" />
            ...
        </ContentView>
    </StackLayout> 
</ContentPage>

Но я хочуиметь два ContentView в отдельных файлах.

DisplayArea состоит среди других из метки RegX:

<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
            x:Class="Proj1.ViewModels.DisplayArea">
    ...
    <Label Grid.Row="0" Grid.Column="1" x:Name="InpRegX" />
    ...
</ContentView>


namespace Proj1.ViewModels
{
    public partial class DisplayArea : ContentView
    {
        public readonly MyClass RegX;  // made public for simplicity

        public DisplayArea ()
        {
            InitializeComponent ();

            RegX = new MyClass(InpRegX);
        }
    }
}

Теперь я хочу выполнить метод .AddChar () из DisplayArea.RegX из кнопкиclock.

namespace Proj1.ViewModels
{
    public partial class ButtonArea : ContentView
    {
        public ButtonArea ()
        {
            InitializeComponent ();
        }

        private void BtnClicked(object sender, EventArgs e)
        {
            var btn = (Button)sender;

            DisplayArea.RegX.AddChar(btn.Text);  // ERROR!
        }
    }
}

Это создает ошибку компилятора:

Ссылка на объект требуется для нестатического поля, метода или свойства 'DisplayArea.RegX

Это потому, что я ссылаюсь на RegX через класс , а не на реальный экземпляр объекта .Но как я могу найти имя, которое компилятор создает для экземпляра?

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

в вашем XAML, присвойте имя

<vm:DisplayArea x:Name="MyDisplayArea />

, затем в вашем xaml.cs

private void BtnClicked(object sender, EventArgs e)
    {
        var btn = (Button)sender;

        MyDisplayArea.RegX.AddChar(btn.Text);  // ERROR!
    }
0 голосов
/ 13 октября 2018

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

Пример:

public static class Util
{
    public static string GlobalString = "Hello World";

    public static string GetCurrentLanguage()
    {
        string SelectedLangProp;

        if (Application.Current.Properties.ContainsKey("SelectedLangProp"))
        {
            SelectedLangProp = Application.Current.Properties["SelectedLangProp"] as string;
        }
        else
        {
            SelectedLangProp = "AR";//default language
        }

        return SelectedLangProp;
    }
}

Вы можете получить доступ к статическим переменным из любого места, используя:

String TestGlobal = Util.GlobalString; //"Hello World"

То же самое касается вызовов методов:

String MethodResult = Util.GetCurrentLanguage();

Есть альтернативный способ, который ближе к тому, что вы спросили:

DisplayArea display = new DisplayArea();
String Result = display.RegX.AddChar(btn.Text);

Это будет работать, но это создаст новый экземпляр класса, который не рекомендуется, особенно потому, что вы используете класс contentview иВыполнение логики в коде вместо использования MVVM является рекомендуемой структурой для создания приложений Xamarin.

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