我有一个名为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并且永远不会注销,即使该变量设置正确。
我是否需要再次注册此按钮?或者我做错了什么?
感谢您的帮助和时间
答案 0 :(得分:0)
在WPF中执行此操作的典型方法是使用Model-View-ViewModel模式。详细了解here
基本上你必须创建一个类(ViewModel),它将通知你的按钮(View),当UserLoggedIn(模型)改变时它必须改变它的内容。当UserLoggedIn的值发生更改时,此类必须实现INotifyPropertyChanged
并触发PropertyChanged事件,因此UI会相应更改。所以你几乎不应该从代码中引用你的按钮(btnLogin),相反,按钮应该是数据绑定到来自XAML的ViewModel对象中的变量,并在它发生变化时得到通知。
使用此模式的好处在于,您将使用声明方法处理大多数逻辑,使用数据绑定和触发器,并且UI逻辑将与业务逻辑分离。如果您是WPF的新手,我建议您首先阅读MVVM模式,因为从长远来看,它将为您节省很多的时间。
你在那里展示的逻辑完成了触发器执行的完全相同的任务,但你可能正在将业务代码与UI代码混合(即你有一个管理登录和的类知道哪个用户登录时显示的图片。)
但是,如果你想坚持你的设计。我猜测问题是你只运行那段代码一次(“当窗口被加载时我有这段代码”),你应该在用户登录时运行CheckLoginButton,或者更准确地说,当UserLoggedIn值改变时运行是真还是假。