1

私はWindows Phoneアプリを開発しています.アプリでは、複数のチェックボックスを配置したい.複数のチェックボックスを配置できます.しかし、チェックボックスをオンにすると、その内容(チェックボックスの内容)を取得したい.イベントとイベントをクリックしますが、私が望むように結果を得ることができません.私のxamlコードは次のとおりです:

        <ListBox Name="hobbylist" ItemsSource="{Binding}" Margin="0,0,10,10" >

            <ListBox.ItemTemplate>

                <DataTemplate>

                    <StackPanel Orientation="Horizontal">

                        <CheckBox Name="hobbycheck" Content="{Binding Path=Title}"

                                  IsChecked="{Binding IsSelected}" ClickMode="Release" 

                Click="CheckBox_Click" ></CheckBox>
                    </StackPanel>

                </DataTemplate>

            </ListBox.ItemTemplate>

        </ListBox>

    </Grid>

私を助けてください ...

4

2 に答える 2

2

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オブジェクト名にバインドされます。少しあいまいですよね?より明確にするために、この場合、、. また、テンプレートには、のプロパティにバインドされているものが必要です。ViewModelDataContextItemsSource="{Binding HobbiesCollection}"ObservableCollectionCheckBoxModel

<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

幸運を!

于 2013-09-20T09:35:33.487 に答える
1

もっと簡単な解決策を見つけました。

私のモデル

2 つの変数を使用する必要があります。そうしないと、「stackoverflowexception」が発生する可能性があります

    public class ModelObj
    {
        public int position { set; get; }
        public bool isChecked
        {
            get { return IsChecked; }
            set { IsChecked = value; }
        }
        public bool IsChecked;
    }

xaml に追加するコード:

  1. isChecked in xaml は ListView チェックボックスを設定します

  2. Mode=TwoWay は、モデル クラスの isChecked ブール値を更新します

    <CheckBox IsChecked="{Binding isChecked , Mode=TwoWay}"  Checked="checkBox_Checked" >
    

イベントを処理する c# コード

   private void checkBox_Checked(object sender, RoutedEventArgs e)
    {
        foreach (ModelObj obj in listItem)
        {
            if (obj.isChecked == true)
            {
                int selectedPosition = obj.position;
            }

        }
    }
于 2017-01-09T06:46:40.013 に答える