以编程方式更改按钮的内容

时间:2011-11-05 19:30:38

标签: wpf button user-controls wpf-controls

我有一个名为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并且永远不会注销,即使该变量设置正确。

我是否需要再次注册此按钮?或者我做错了什么?

感谢您的帮助和时间

1 个答案:

答案 0 :(得分:0)

在WPF中执行此操作的典型方法是使用Model-View-ViewModel模式。详细了解here

基本上你必须创建一个类(ViewModel),它将通知你的按钮(View),当UserLoggedIn(模型)改变时它必须改变它的内容。当UserLoggedIn的值发生更改时,此类必须实现INotifyPropertyChanged并触发PropertyChanged事件,因此UI会相应更改。所以你几乎不应该从代码中引用你的按钮(btnLogin),相反,按钮应该是数据绑定到来自XAML的ViewModel对象中的变量,并在它发生变化时得到通知。

使用此模式的好处在于,您将使用声明方法处理大多数逻辑,使用数据绑定和触发器,并且UI逻辑将与业务逻辑分离。如果您是WPF的新手,我建议您首先阅读MVVM模式,因为从长远来看,它将为您节省很多的时间。

你在那里展示的逻辑完成了触发器执行的完全相同的任务,但你可能正在将业务代码与UI代码混合(即你有一个管理登录的类知道哪个用户登录时显示的图片。)

但是,如果你想坚持你的设计。我猜测问题是你只运行那段代码一次(“当窗口被加载时我有这段代码”),你应该在用户登录时运行CheckLoginButton,或者更准确地说,当UserLoggedIn值改变时运行是真还是假。