我有一个列表框,它有一个复选框作为项目模板的一部分。
在复选框的单击中,我想确保选择了相同的列表项。
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。
我有一个要通过复选框打开和关闭的图层列表,我对另一种方式持开放态度......
答案 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}" >