【问题标题】:Silverlight ListBox Checkbox Selected ItemSilverlight ListBox 复选框 选定项
【发布时间】:2009-09-23 19:27:51
【问题描述】:

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

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

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。

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

【问题讨论】:

标签: .net silverlight xaml user-interface


【解决方案1】:

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

This example 显示您需要做什么才能到达复选框。

以下是该问题的其他一些解决方案

您应该在 ListboxItem 和 CheckBox 之间使用 RelativeSource 绑定。 数据模板包含一个复选框。将其更改为如下所示。

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

这会在 ListBox 的 IsSelected 属性和 CheckBox 的 IsChecked 属性之间创建一个绑定。 This 教程用一个例子来解释。

如果您需要更多控制,您应该查看behaviors and triggers。它们有点复杂,但可以让您拥有更多控制权。

【讨论】:

  • 这看起来不错,但要么我没有足够的能力适用于我的情况,要么它不是我想要的。
  • 我试过这个:"" 但是在 Click 事件处理程序上我有代码以上结果为空。
  • 您是在处理对列表框还是对复选框的点击?
  • 我认为在实际选择列表框项之前处理了对复选框的单击,这可能会给出错误的结果。您是否尝试过处理列表框上的 selectionChanged 事件?
  • 使用 SelectionChanged 事件有效;如何检查当前 ListBoxItem 中复选框的值?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    这就是我所做的。

    首先我将需要获取的元素绑定到 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);
            }         
    
        }
    

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多