Изменение содержимого кнопки программно

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

Итак, на данный момент у меня есть экран входа в систему и после входа в систему я устанавливаю эту переменную:-

        ApplicationState.SetValue("UserLoggedIn", "True");

Затем на главном экране у меня есть этот кусок кода, когда окно загружается:

    private void CheckLoginButton()
    {
        //check if user is checked in or out
        if (String.IsNullOrEmpty(ApplicationState.GetValue<string>("UserLoggedIn")))
        {
            //User not logged in
            ImageSource largeImageSource =
                new BitmapImage(new Uri(@"/myAppWPF;component/Images/administrator-icon32.png", UriKind.Relative));
            ImageSource smallImageSource =
                new BitmapImage(new Uri(@"/myAppWPF;component/Images/administrator-icon16.png", UriKind.Relative));
            btnLogin.LargeImageSource = largeImageSource;
            btnLogin.SmallImageSource = smallImageSource;
            btnLogin.Label = "Login";
            btnLogin.ToolTipTitle = "Please Log In";

        }
        else
        {
            //User logged in
            ImageSource largeImageSource =
                new BitmapImage(new Uri(@"/myAppWPF;component/Images/logout32.png", UriKind.Relative));
            ImageSource smallImageSource =
                new BitmapImage(new Uri(@"/myAppWPF;component/Images/logout16.png", UriKind.Relative));
            btnLogin.LargeImageSource = largeImageSource;
            btnLogin.SmallImageSource = smallImageSource;
            btnLogin.Label = "Log Out";
            btnLogin.ToolTipTitle = "Log Out";
        }
    }

и в XAML у меня есть следующее:

<r:RibbonGroup Name="AdminGroup" Header="Admin" >
    <r:RibbonButton Name="btnLogin" Click="btnLogin_Click" ></r:RibbonButton>
</r:RibbonGroup>

Однако каждый раз btnLogin всегда установлен на Login и никогда на Logout, даже если переменная установлена ​​правильно.

Нужно ли снова регистрировать эту кнопку? Или я что-то не так делаю?

Спасибо за вашу помощь и время

1 ответ

Типичный способ сделать это в WPF - использовать шаблон Model-View-ViewModel. Подробнее об этом здесь

По сути, вы должны создать класс (ViewModel), который будет уведомлять вашу кнопку (представление), что она должна изменить свое содержимое при изменении UserLoggedIn (модель). Этот класс должен реализовывать INotifyPropertyChanged и инициировать событие PropertyChanged, когда значение UserLoggedIn изменяется, таким образом, соответственно изменяется пользовательский интерфейс. Таким образом, вы почти никогда не должны ссылаться на вашу кнопку (btnLogin) из кода, вместо этого кнопка должна быть привязана к переменной в вашем объекте ViewModel из XAML и получать уведомления при ее изменении.

Прелесть использования этого шаблона в том, что вы будете использовать декларативный подход для большей части логики, используя привязку данных и триггеры, и что логика пользовательского интерфейса будет отделена от вашей бизнес-логики. Если вы новичок в WPF, я советую вам сначала прочитать о шаблоне MVVM, так как это сэкономит вам много времени в долгосрочной перспективе.

Логика, которую вы показываете там, выполняет точно такую ​​же задачу, что и триггер, но вы, вероятно, смешиваете бизнес-код с кодом пользовательского интерфейса (т.е. у вас есть класс, который управляет как входом в систему, так и знает, какую картинку показывать, когда пользователь вошел в систему),

Однако, если вы хотите придерживаться своего дизайна. Я предполагаю, что проблема в том, что вы выполняете этот код только один раз ("У меня есть этот кусок кода, когда окно загружено"), и вы должны запустить CheckLoginButton, когда пользователь входит в систему, или, точнее, при изменении значения UserLoggedIn на истину или ложь.

Другие вопросы по тегам