2012-12-09 39 views
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财产是多余的。我添加它的唯一原因是因为这里:Dynamically (programatically) adding check boxes and checkedchanged events,有几个人说肯定要分配动态创建的复选框的ID属性。然而,在Windows 8 C#应用程序中,显然没有这种属性。

回答

1

Control.Tag定义:

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

所以,除非你需要将一个对象与你的控件关联,否则你可以忽略它,你会在以后访问currentItem吗?

2

在Windows应用商店应用程序中没有技术要求根据其属性区分控件。您是否需要将currentItem与您的复选框关联取决于您的事件处理程序的功能。如果您需要对与之相关的currentItem执行某些操作,则需要从事件处理程序访问它。将其设置为Tag上的控制,使这很简单:

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

我不dinamically创建控件这样的大风扇,虽然。大多数情况下,通过使用数据绑定,相同的结果更容易实现。在你的情况下,你需要以下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中调用附加代码。