0

チェックボックスを動的に作成し、それらを共有 OnTapped イベント ハンドラーに接続するための次のコードがあります。

private void CreateNewGroup(int currentItem, string groupName)
{
    CheckBox ckbx = new CheckBox();
    ckbx.Content = groupName;
    ckbx.Tag = currentItem; // Don't know if this is needed
    ckbx.Tapped += new TappedEventHandler(this.Checkbox_OnTapped);
    stackPanelCheckBoxesParent.Children.Add(ckbx);
}

...コメントが示すように、Tag プロパティに val を割り当てることが不要かどうかはわかりません。私がそれを追加した唯一の理由は、ここにあるからです:動的に (プログラム的に) チェックボックスとcheckedchangedイベントを追加すると、動的に作成されたチェックボックスのIDプロパティに必ず代入するように言う人が2人います。しかし、Windows 8 の C# アプリには、明らかにそのようなプロパティはありません。

4

2 に答える 2

2

Windows ストア アプリでは、プロパティに基づいてコントロールを区別するための技術的な要件はありません。チェックボックスに関連付ける必要があるかどうかはcurrentItem、イベント ハンドラーの機能によって異なります。それに関連する何かを行うcurrentItem必要がある場合は、イベント ハンドラーからアクセスする方法が必要になります。コントロールのように設定するとTag、非常に簡単になります。

public delegate void TappedEventHandler(object sender, TappedRoutedEventArgs e)
{
    var item = (int)((CheckBox)sender).Tag;
    // do something with the value
}

ただし、私はこの方法でコントロールを動的に作成することは好きではありません。ほとんどの場合、データ バインディングを使用すると、同じ結果を簡単に得ることができます。あなたの場合、次の XAML が必要です。

<ItemsControl ItemsSource="{Binding Groups}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding Name}" IsChecked="{Binding IsChecked, Mode=TwoWay}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

ページの時点DataContextで、ビュー モデルに次のものが必要です。

public class ViewModel
{
    public List<Group> Groups { get; set; }
}

public class Group
{
    private bool _isChecked;

    public int Id { get; set; }
    public string Name { get; set; }

    public bool IsChecked
    {
        get { return _isChecked; }
        set
        {
            if (_isChecked != value)
            {
                _isChecked = value;
                // react to value change if necessary   
            }
        }
    }
}

CheckBoxGroup状態が対応するインスタンスに自動的に反映されるようになりました。IsChecked必要に応じて、セッターで追加のコードを呼び出すことができます。

于 2012-12-10T06:06:01.943 に答える
1

Control.Tagの定義:

Tagプロパティの一般的な使用法は、コントロールに密接に関連付けられているデータを格納することです。たとえば、顧客に関する情報を表示するコントロールがある場合、データにすばやくアクセスできるように、顧客の注文履歴を含むDataSetをそのコントロールのTagプロパティに保存できます。

したがって、オブジェクトをコントロールに関連付ける必要がない限り、それを省略できます。後でアクセスしcurrentItemますか?

于 2012-12-09T23:50:00.590 に答える