Checkbox
目的に応じて正しく使用していないと思います。
Checkbox
件名に関する状態 (たとえば、はい/いいえ) を表す必要があります。それでも、Checked
チェックボックスがチェックされたときなどにイベントを使用する必要がありUnchecked
ます。
そのため、Checked
イベントでは、必要なコンテンツを入手してください。
編集
どういうわけかMVVMパターンでこれを維持する必要があります。そのために、インターネットにはたくさんの例があります。それを処理できると確信しています。
の代わりに、イベントClick="CheckBox_Click"
を使用します。Check
private void CheckBox_Checked (Object sender, EventArgs e)
{
var currentCheckBoxItem = sender as CheckBox;
if (currentCheckBoxItem.IsChecked == true)
{
//you manipulation here...
}
}
まだ。問題の詳細を十分に提供していないため、これは機能しない可能性があります。
編集2 MVVMの少し...
まず、 Hobby
単一の文字列プロパティを持つモデル クラスを作成します (後で気が変わってプロパティをさらに追加することもできます) :
public class Hobby : INotifyPropertyChanged
{
private string _name;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
OnPropertyChanged();
}
}
private bool _isSelected;
public bool IsSelected
{
get
{
return _isSelected;
}
set
{
_isSelected = value;
OnPropertyChanged();
}
}
//You can add some multiple properties here (***)
public Hobby (string hobbyName, bool isSelected)
{
Name = hobbyName;
IsSelected = isSelected;
}
//INotifiyPropertyChanged interface member implementation ...
}
( * )たとえば、短い説明をビューにバインドします。この MVVM パターンの主な利点はロジックの分離であるため、何かを変更する必要がある場合は、各コンポーネントを分離することで簡単に変更できます。
次に、ViewModel クラスを作成します (INotifyPropertyChanged インターフェイスを実装する必要があります)。
public class HobbiesViewModel : INotifyPropertyChanged
{
private ObservableCollection<Hobby> _hobbies;
public ObservableCollection<Hobby> HobbiesCollection
{
get
{
return _hobbies;
}
set
{
_hobbies = value;
OnPropertyChanged();
}
}
//Constructor
public HobbiesViewModel
{
HobbiesCollection = new ObservableCollection<Hobby>();
}
//INotifyPropertyChanged interface member implementation ...
}
3 番目に、ViewModel (ObservableCollection) のインスタンスを作成します。このクイック ヘルプを使用してください。App.xaml.cs
で、静的オブジェクトを作成し、必要に応じてアプリで使用します。
public partial class App
{
//This already exists in your app's code, but I've written it to
//make an idea where to write the Hobbies object
public static PhoneApplicationFrame RootFrame { get; private set; }
public static HobbiesViewModel Hobbies;
//Again, the already existing constructor
public App()
{
...
Hobbies = new HobbiesViewModel();
}
これで、ほぼすべての設定が完了しました。Model と ViewModel があれば、あとは View との接続を作成するだけです。これは、バインドによって簡単に実行できます。ViewModel はDataContext
、コントロールの を表します (あなたの場合はLongListSelector
であるため、そのビューの (ページの) コンストラクターで、次のステートメントを記述します。
yourListControlName.DataContext = App.Hobbies;
これでバインディングだけが残りました。これは XAML コードで行われます。コントロールがどのように見えるかは、あなたが最もよく知っているので、ここでは XAML コードの全体をここには入れません。それでも、あなたが提供した短いサンプルから判断すると、いくつかの調整しかありません:
リスト XAML コントロールのアイテム ソースは、コントロールの を表す のObservableCollection
オブジェクト名にバインドされます。少しあいまいですよね?より明確にするために、この場合、、. また、テンプレートには、のプロパティにバインドされているものが必要です。ViewModel
DataContext
ItemsSource="{Binding HobbiesCollection}"
ObservableCollection
CheckBox
Model
<DataTemplate>
<StackPanel Orientation="Horizontal"> //StackPanel is kinda useless if you have
//only one child control in it. But I wrote
//according to your code.
<Checkbox Content="{Binding Name}" IsChecked="{Binding IsSelected, Mode=TwoWay}"/>
</StackPanel>
</DataTemplate>
さて、ここで物事は私には少し不明確です。チェックボックスを使用する理由 私は次の可能なシナリオを考えました: Json データの逆シリアル化を通じて、一連の趣味を持っています。それらを に追加するには、次のViewModel
ものが必要です。
App.Hobbies.HobbiesCollection.Add(new Hobby("firstHobbyFromJson", true));
App.Hobbies.HobbiesCollection.Add(new Hobby("secondHobbyFromJson", true));
これにより、すべての趣味が で選択済みになりView
ます。他の趣味を追加すると思いますが、ユーザーは選択されていないものを持っていないので、今すぐ追加できます。
App.Hobbies.HobbiesCollection.Add(new Hobby("aNewHobby", false));
App.Hobbies.HobbiesCollection.Add(new Hobby("anotherNewHobby", false));
この時点で、ユーザーの以前の趣味がすべてリストに表示され、ユーザーに提供した新しい趣味もいくつか表示されます。彼の選択が完了した後、選択した趣味のみで Json をシリアル化する必要がある場合は、次のようになります。
var userHobbies = App.Hobbies.HobbiesCollection.Where(h => h.IsSelected);
IsSelected
または foreach を使用して、 のプロパティを持つ趣味のオブジェクトのみを取得しますtrue
。
幸運を!