2012-12-05 10 views
7

私のXAML + C#Windowsストアアプリケーションにチェックボックスがあります。また、私はboolプロパティを持っています:WindowsStoreTestApp.SessionData.RememberUserは、パブリックと静的です。XAMLプロパティへのバインド

チェックボックスのプロパティIsCheckedは、このboolプロパティとの一貫性(バインドまたはマップ)が必要です。

私はこれを試してみました:プロパティの XAML

<CheckBox x:Name="chbRemember1" IsChecked="{Binding Mode=TwoWay}"/> 

C#

chbRemember1.DataContext = SessionData.RememberUser; 

コード:

namespace WindowsStoreTestApp 
{ 
    public class SessionData 
    { 
     public static bool RememberUser { get; set; } 
    } 
} 

をしかし、動作するようには思えません。手伝って頂けますか?

+0

何が問題になるのでしょうか?それは動作しない双方向の更新ですか?それはまったく動作しませんか?また、SessionData(特にRememberUser)のコードを表示できますか?それが問題の診断に役立ちます。 –

+0

それらのうちの1つが変化するたびに、秒も同様に変化するはずです。 – imslavko

+0

どちらを変更しても、マッピングは機能しません。私はコード内のプロパティを変更しようとしましたが、チェックボックスはチェックしませんでした。対抗しようとしましたが、チェックボックスをオンにしてデバッガで表示されましたが、プロパティは変更されませんでした – imslavko

答えて

3

プロパティへの変更をチェックするために、変更通知のフォームを実装する必要があります。最良の方法は、そこに多くのMVVMフレームワークを使用することです。そうでない場合は、ViewModelにINotifyPropertyChangedを実装します。

また、一般的にWPFで、我々は個々のコントロールのDataContextのを設定しませんが、ViewModelににウィンドウまたはユーザーコントロールのDataContextの設定...

ここでは通じ変更通知を持つプロパティの例です。 MVVMフレームワークの1:あなたは、単純な自動実装プロパティは、WPFでデータバインディングに使用することはできません見ることができるように

private bool createTrigger; 
public bool CreateTrigger 
{ 
    get { return createTrigger; } 
    set { createTrigger = value; NotifyPropertyChanged(m => m.CreateTrigger); } 
} 

...

私はMSDNにオーバーData Binding Overview介さお勧めします。.. 。

+0

あなたの答えをありがとう。 1つのプロパティだけをバインドする簡単な方法はありますか?私は1つのプロパティのためのトンのコードを生成する必要はありません、それだけで簡単に変更イベントを処理することです。 – imslavko

+0

あなたのWindowまたはUser ControlのDataContextをViewModelクラスに設定するのは、まったく複雑ではなく、そのクラスでは、上に示したようにプロパティを定義します。 MVVMフレームワークで作業したくない場合は、そのクラスのINotifyPropertyChangedインタフェースを実装して、プロパティの変更がコントロールに通知されるようにするのが最も簡単です。結局のところ、それほど多くのコードはありません... –

5
<CheckBox x:Name="chbRemember1" IsChecked="{Binding Path=RememberUser, Mode=TwoWay}"/> 

 

public class SessionData : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(string info) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
    } 


    bool _rememberUser; 
    public bool RememberUser 
    { 
     get 
     { 
      return _rememberUser; 
     } 
     set 
     { 
      _rememberUser = value; 
      NotifyPropertyChanged("RememberUser"); 
     } 
    } 
} 
3

プロパティは静的ではなく、バッキングフィールドがあることに注意し、このようにしてみてください。

public class SessionData : INotifyPropertyChanged 
{ 
    private static bool _rememberUser; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public bool RememberUser 
    { 
     get { return _rememberUser; } 
     set 
     { 
      _rememberUser = value; 
      OnPropertyChanged(); 
     } 
    } 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
this.DataContext = new SessionData(); 
<CheckBox x:Name="chbRemember1" IsChecked="{Binding RememberUser, Mode=TwoWay}"/> 
3

静的プロパティはPropertyChangedイベントを発生させることができないため、静的プロパティにバインドすることはできません。もちろん、INotifyPropertyChangedが必要です。しかし、これは静的プロパティとは関係ありません。静的なプロパティにバインドすることはできません。 (あなたはWPFとSilverlightで行うことができます)

関連する問題