我已经有了这个代码来动态创建复选框并将它们连接到共享的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#应用程序中,显然没有这样的属性。
答案 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
?