.net Silverlight列表框复选框选中的项目

.net Silverlight列表框复选框选中的项目,.net,silverlight,xaml,user-interface,.net,Silverlight,Xaml,User Interface,我有一个列表框,其中有一个复选框作为项目模板的一部分 在复选框的“偶数单击”中,我希望确保选中了相同的列表项 ListBoxItem lbi = ((ListBoxItem)listLayers. ContainerFromElement((CheckBox)sender)); lbi.IsSelected = true; 我遇到的主要问题是“ContainerRomeElement”在silverlight中不可用 非常感谢您的帮助 编辑 这是我

我有一个列表框,其中有一个复选框作为项目模板的一部分

在复选框的“偶数单击”中,我希望确保选中了相同的列表项

ListBoxItem lbi = ((ListBoxItem)listLayers.
                       ContainerFromElement((CheckBox)sender));
lbi.IsSelected = true;
我遇到的主要问题是“ContainerRomeElement”在silverlight中不可用

非常感谢您的帮助

编辑

这是我在列表中复选框的单击事件中运行的代码:

MyObject obj = listLayers.SelectedItem as MyObject;
obj.Visible = true;
obj.Value = "50";
使用复选框上的RelativeSource绑定以及这段代码,我最终得到的obj等于null


我有一个层列表,我想通过复选框打开和关闭,我打开了另一种方式…

在selectionChanged事件中,您必须“漫游”视觉树才能找到复选框。您可以使用

显示进入复选框所需的操作

下面是解决此问题的一些其他解决方案

应该在ListboxItem和复选框之间使用RelativeSource绑定。 datatemple包含一个复选框。把它改成这样

<CheckBox 
  IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, 
    Path=IsSelected, Mode=TwoWay}" />

这将在ListBox的IsSelected属性和复选框的IsChecked属性之间创建绑定。 本教程通过一个例子说明了如何使用


如果你需要更多的控制,你应该看看。它们有点复杂,但给你更多的控制权。

省去麻烦,创建复选框,将它们添加到代码隐藏中的StackPanel中,然后迭代它们,只需查找那些已被选中的。Value=True。 我花了2分钟

foreach(Object object in MyList){
    CheckBox cb1 = new CheckBox() { Content = object.MyProperty};
    MyStackPanel.Children.Add(cb1);
}

您还可以在codebehind上设置集合、可观察集合或散列,并设置复选框的选中和取消选中方法,以便您可以添加或删除它为我设计的选定对象(我还没有尝试堆栈面板)

这就是我所做的

首先,我绑定了需要到达复选框标记的元素

<CheckBox Grid.Column="1" Margin="3" Height="50" Width="70" Visibility="Visible" 
    Tag="{Binding Id}" Checked="CheckBox_Checked" 
    Unchecked="CheckBox_Unchecked" />

然后在后面的代码中,无论何时检查或取消检查,我都会得到id,我确信这就是显示的元素,因为它与我在绑定中使用的元素相同

    using System.Collections.ObjectModel;
    private ObservableCollection<Guid> SelectedLocations = new ObservableCollection<Guid>();
    private void CheckBox_Checked(object sender, RoutedEventArgs e)
    {
        Guid _guid = new Guid((((CheckBox)sender).Tag).ToString());
        if (!SelectedLocations.Contains(_guid))
        {
            SelectedLocations.Add(_guid);
        }           
    }

    private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
    {
        Guid _guid = new Guid((((CheckBox)sender).Tag).ToString());

        if (SelectedLocations.Contains(_guid))
        {
            SelectedLocations.Remove(_guid);
        }         

    }
使用System.Collections.ObjectModel;
私有ObservableCollection SelectedLocations=新ObservableCollection();
已选中私有无效复选框(对象发送方、路由目标方)
{
Guid _Guid=新Guid(((复选框)sender.Tag).ToString();
如果(!SelectedLocations.Contains(_guid))
{
所选位置。添加(\u guid);
}           
}
私有无效复选框\u未选中(对象发送方,路由目标)
{
Guid _Guid=新Guid(((复选框)sender.Tag).ToString();
if(SelectedLocations.Contains(_guid))
{
所选位置。删除(\u guid);
}         
}

看,当你完成后,你已经在代码中列出了要检查的内容…

对我来说,这段代码解决了这个问题

<CheckBox IsChecked="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected, Mode=TwoWay}" >


这看起来不错,但要么我没有得到足够的信息来应用于我的情况,要么这不正是我想要的。我已经尝试过这个方法:但是在单击事件处理程序上,我上面的代码最终为空。您是在处理单击列表框还是在处理复选框?我认为在实际选择列表框项目之前,会处理单击复选框,这可能会给出错误的结果。您是否尝试过处理列表框上的selectionChanged事件?使用selectionChanged事件正在工作;如何检查当前ListBoxItem中复选框的值?如本演示中的复选框列表?