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);
}

...正如评论所示,我不知道将 val 分配给 Tag 属性是否是多余的。我添加它的唯一原因是因为这里:动态(以编程方式)添加复选框和checkedchanged事件,有几个人说一定要分配给动态创建的复选框的ID属性。然而,在 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   
            }
        }
    }
}

CheckBoxstate 现在将自动反映在相应的Group实例中。IsChecked如有必要,您可以在 setter 中调用其他代码。

于 2012-12-10T06:06:01.943 回答
1

Control.Tag的定义:

Tag 属性的一个常见用途是存储与控件密切相关的数据。例如,如果您有一个显示客户信息的控件,您可以在该控件的 Tag 属性中存储一个包含客户订单历史记录的 DataSet,以便可以快速访问数据。

因此,除非您需要将一个对象与您的控件相关联,否则您可以省略它,您稍后会访问currentItem?

于 2012-12-09T23:50:00.590 回答