2011-11-05 11 views
0

私は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> 

、毎回、B変数が正しく設定されていても、tnLoginは常にLoginに設定され、Logoutには決して設定されません。

このボタンをもう一度登録する必要はありますか?または私は何か間違っているのですか? WPFでこれを行うにはあなたの助けと時間を

おかげ

+0

ログイン前またはログイン後にウィンドウが読み込まれていますか? –

答えて

0

典型的な方法は、モデル - ビュー - ViewModelにパターンを使用することです。それについての詳細を読むhere

基本的に、UserLoggedIn(モデル)が変更されたときに内容を変更する必要があることをボタン(ビュー)に通知するクラス(ViewModel)を作成する必要があります。このクラスはINotifyPropertyChangedを実装し、UserLoggedInの値が変更されたときにPropertyChangedイベントをトリガーする必要があります。したがって、コードからボタン(btnLogin)を参照することはほとんどありません。代わりに、ボタンはXAMLのViewModelオブジェクトの変数にバインドされたデータであり、変更があったときに通知を受ける必要があります。

このパターンを使用することの美しさは、データバインディングとトリガーを使用してロジックのほとんどに対して宣言的アプローチを使用し、UIロジックがビジネスロジックから分離されることです。 WPFの初心者であれば、最初にMVVMパターンについて読むことをお勧めします。多くの場合、長期的にはの時間が節約されます。

トリガーが実行するのと全く同じタスクを実行しますが、ビジネスコードをUIコードと混同している可能性があります(つまり、ログインを管理するクラスがあります。は、ユーザーはログインしています)。

ただし、デザインにこだわりたい場合。私は問題を推測しているのは、そのコードを一度しか実行していないということです(ユーザーがログインしたときにCheckLoginButtonを実行するか、より正確にはUserLoggedIn値が変更されたときにtrueまたはfalseに設定します。

+0

こんにちはJuan、ご返信ありがとうございます。はい、私は、MVVMのパターンについて読んで勉強する必要がありますが、現時点では私はちょうどWPFに慣れて小さなアプリケーションを構築しています。私はコンストラクタでコードを持っています。私はインスタンスとしてログイン画面を持っています。だから私は "ログイン"ウィンドウを閉じると、メインのコンストラクタに戻って制御が渡され、私は変数が正しく設定されていることを確認し、正しいコードが実行されます。しかし、すべてが同じままです!だから私は多分それが動作するために何かをリフレッシュする必要があると思っていた – Johann

+0

あなたはこの問題を解決しましたか?私が理解しているように、メインウィンドウとログインウィンドウの2つのウィンドウがあります。使用しているコントロール(つまりr:RibbonButton)に問題がある可能性があります。これは作成したカスタムコントロールですか?それはControlTemplateを持っていますか? –

関連する問題