Silverlight ListBox复选框选定项

时间:2009-09-23 19:27:52

标签: .net silverlight xaml user-interface

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

在复选框的单击中,我想确保选择了相同的列表项。

ListBoxItem lbi = ((ListBoxItem)listLayers.
                       ContainerFromElement((CheckBox)sender));
lbi.IsSelected = true;

我遇到的主要问题是Silverlight中没有“ContainerFromElement”。

非常感谢任何帮助。

修改

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

MyObject obj = listLayers.SelectedItem as MyObject;
obj.Visible = true;
obj.Value = "50";

在复选框上使用RelativeSource绑定以及此代码,我最终得到的obj等于null。

我有一个要通过复选框打开和关闭的图层列表,我对另一种方式持开放态度......

4 个答案:

答案 0 :(得分:5)

在selectionChanged事件中,您必须“遍历”可视树以找到该复选框。您可以使用VisualTreeHelper

执行此操作

This example显示了进入复选框需要执行的操作。

以下是此问题的其他解决方案

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

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

这将在ListBox的 IsSelected 属性和CheckBox的 IsChecked 属性之间创建绑定。 This教程解释了如何使用示例。

如果您需要更多控制权,请查看behaviors and triggers。它们有点复杂但给你更多的控制权。

答案 1 :(得分:0)

省去麻烦并创建Checkbox,将它们添加到Code Behind中的StackPanel,然后迭代它们,只查找具有IsChecked.Value = True的那些。 花了我2分钟。

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

答案 2 :(得分:0)

您还可以在代码隐藏中设置集合,可观察集合或散列集,并设置一个方法来检查和取消选中复选框,以便您可以添加或删除它为我设计的所选对象(我还没有尝试过)堆栈面板)...

这就是我所做的。

首先我绑定了我需要的元素来获取CheckBox的标签

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

    }

请注意,所以当你完成后,你已经在代码中列出了所检查的内容......

答案 3 :(得分:0)

对我来说 - 这段代码解决了这个目的。

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