我是否需要区分动态创建的复选框?

时间:2012-12-09 23:43:25

标签: c# dynamic checkbox event-handling windows-store-apps

我已经有了这个代码来动态创建复选框并将它们连接到共享的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是多余的。我添加它的唯一原因是因为这里:Dynamically (programatically) adding check boxes and checkedchanged events,有几个人说要确保动态创建的复选框的ID属性。然而,在Windows 8 C#应用程序中,显然没有这样的属性。

2 个答案:

答案 0 :(得分: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   
            }
        }
    }
}

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

答案 1 :(得分:1)

Control.Tag的定义:

  

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

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