Как назначить переменную в классе - PullRequest
0 голосов
/ 29 августа 2018

Я застрял в проблеме и мог бы помочь. Так что это примерно мой код:

x.cs
    using References;
....

namespace Name
{
....
public sealed partial class ReaderPage : Page, View.Listener
{
....

private View view;
.....

class MyMenuFlyoutItem : MenuFlyoutItem

   {
    public MyMenuFlyoutItem()
    {
        this.Click += MyMenuFlyoutItem_Click;

    }

private void MyMenuFlyoutItem_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
    {
        var dataPackage = new DataPackage();
        dataPackage.SetText(view.vSelGetText());
        Clipboard.SetContent(dataPackage);
    }
   }
....
 }
}


y.cs
....
        public String vSelGetText()
       {
        ....
        }
....

Теперь моя проблема в том, что «представление» в классе MyMenuFlyoutItem выдает мне ошибку. Как это возможно, поэтому класс MyMenuFlyout берет представление из x.cs для dataPackage.SetText (view.vSelGetText ()) ;? Ошибка: «Требуется ссылка на объект для нестатического поля, метода или свойства x.view»

1 Ответ

0 голосов
/ 29 августа 2018

Вы не можете получить доступ к нестатическому полю view класса ReaderPage из метода экземпляра класса MyMenuFlyoutItem. Несмотря на то, что MyMenuFlyoutItem является вложенным классом из ReaderPage и / или объявлен в одном и том же файле, эти классы и их экземпляры полностью независимы друг от друга. Думайте об этом, как будто MyMenuFlyoutItem не был объявлен как вложенный:

public sealed partial class ReaderPage : Page, View.Listener
{
    private View view;
}

class MyMenuFlyoutItem : MenuFlyoutItem
{
    private void MyMenuFlyoutItem_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
    {
        var dataPackage = new DataPackage();
        // cannot access view
        dataPackage.SetText(view.vSelGetText());
        Clipboard.SetContent(dataPackage);
    }
}

Из вышесказанного очевидно, что MyMenuFlyoutItem нужен некоторый экземпляр ReaderPage, чтобы получить доступ к view, потому что может быть много экземпляров класса ReaderPage, и компилятор не будет знать, из какого из этих экземпляров должно быть view прочитано. Вложенный класс обладает тем преимуществом, что может «видеть» приватных членов родительского класса, но все же вам нужна ссылка на ReaderPage, из которой вы хотите, чтобы view читался из.

Одним из нескольких возможных решений этой проблемы является передача ссылки на класс ReaderPage в конструктор MyMenuFlyoutItem:

public sealed partial class ReaderPage : Page, View.Listener
{
    // Nested class can access this field despite being declared as private
    private View view;

    class MyMenuFlyoutItem : MenuFlyoutItem
    {
        private ReaderPage page;

        MyMenuFlyoutItem(ReaderPage page)
        {
            this.page = page;
        }

        public MyMenuFlyoutItem()
        {
            this.Click += MyMenuFlyoutItem_Click;
        }

        private void MyMenuFlyoutItem_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
        {
            var dataPackage = new DataPackage();
            // Nested class can access field `view` of parent class, although `view` is declared private
            // but you still need `page` reference
            dataPackage.SetText(page.view.vSelGetText());
            Clipboard.SetContent(dataPackage);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...