Как настроить методы защиты Caliburn Micro для элементов, которые не отображаются? - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь запустить Caliburn Micro в своем проекте, и у меня возникают проблемы с пониманием методов защиты (Can*) в контексте свойств, которые не связаны с представлением (извините, если я получаю моя терминология неверна).

Я адаптировал Пример Тима Кори , чтобы добавить этот фрагмент:

        private bool _connected;

        public bool Connected
        {
            get { return _connected; }
            set { _connected = value; NotifyOfPropertyChange(() => Connected); }
        }

        public bool CanSayHello(bool connected)
        {
            return connected;
        }

        public void SayHello(bool connected)
        {
            Console.WriteLine("Hello!");
        }

        public bool CanClearText(string firstName, string lastName)
        {
            if (String.IsNullOrWhiteSpace(firstName) && string.IsNullOrWhiteSpace(lastName))
            {
                Connected = false;
                return false;
            }
            else
            {
                Connected = true;
                return true;
            }
        }

И связанный xaml:

        <!-- Row 4 -->
        <Button x:Name="ClearText" Grid.Row="4" Grid.Column="1">Clear Names</Button>
        <Button x:Name="SayHello" Grid.Row="4" Grid.Column="2">Say Hello</Button>

Кнопка SayHello никогда не активируется (даже если кажется, что она должна иметь то же состояние, что и CanClearText). Намерение состоит в том, чтобы использовать Connected в качестве посреднической собственности; в приложении, которое я собираю, идея заключается в том, что Connected фактически устанавливается внешним сообщением (из модели - не связано с представлением).

Этот вопрос добираюсь до этого немного, но я бы хотел избежать явного вызова NotifyOfPropertyChange(() => CanSayHello); и позволить фреймворку Caliburn Micro сделать всю работу за меня. Я довольно новичок в этом, и я уверен, что я упускаю что-то простое - спасибо за вашу помощь.

1 Ответ

0 голосов
/ 18 февраля 2020

Caliburn Micro, в данном конкретном случае, может оказаться не простым решением. Вы должны будете запускать NotifyPropertyChanged вручную для зависимых свойств, таких как CanSayHello, каждый раз, когда изменяется Связанное свойство. Однако вы можете использовать Fody Extensions, которые могут сделать то же самое для вас, без явного ввода кода.

Например,

[AlsoNotify(nameof(CanSayHello))]
public bool Connected
{
    get { return _connected; }
        set { _connected = value; NotifyOfPropertyChange(() => Connected); }
}

Это, с с помощью переплетения кода можно было бы выполнить NotifyPropertyChanged без необходимости явно делать это самостоятельно.

...