【问题标题】:Accessing checkbox inside a list box in WPF访问WPF列表框中的复选框
【发布时间】:2012-03-12 06:16:48
【问题描述】:

我的代码如下。

<ListBox x:Name="lstBoxMarket"  BorderThickness="0" Height="Auto" HorizontalAlignment="Center"  Width="200" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2">
    <ListBox.ItemTemplate>
        <HierarchicalDataTemplate>
            <CheckBox IsChecked="{Binding Checked}"  CommandParameter="{Binding MarketId}" Tag="{Binding MarketId}" Content="{Binding Market}"  Foreground="#FF3D66BE" Name="chkMarket"/>
        </HierarchicalDataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我想在单击保存按钮时访问列表中选中和取消选中的复选框。我无法立即访问 chkMarket。有人可以帮忙吗?

【问题讨论】:

  • 您在代码中有{Binding Checked} 语句,这意味着您将其绑定到视图模型并将它们的列表存储在某处。 lstBoxMarket 的 DataContext 是什么?

标签: c# wpf xaml checkbox listbox


【解决方案1】:

从您的代码开始,我尝试了类似的方法

                 // find all T in the VisualTree
                 public static IEnumerable<T> FindVisualChildren<T>(DependencyObject parent) 
        where T : DependencyObject
    {
        List<T> foundChilds = new List<T>();

        int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < childrenCount; i++)
        {
            var child = VisualTreeHelper.GetChild(parent, i);

            T childType = child as T;
            if (childType == null)
            {
                foreach(var other in FindVisualChildren<T>(child))
                    yield return other;
            }
            else
            {
                yield return (T)child;
            }
        }
    }

然后在你的主窗口中

    private void button1_Click(object sender, RoutedEventArgs e)
    {
                           // find all checkboxes in my window
        IEnumerable<CheckBox> myBoxes = FindVisualChildren<CheckBox>(this);

        int numChecked = 0;
        foreach(CheckBox cb in myBoxes)
        {
            if(cb.Name != "chkMarket")
                continue;


            if (cb.IsChecked == true)
                numChecked++;

        }

        MessageBox.Show("Checked items = " + numChecked);


    } 

我的视图模型代码是

   public class ViewModel
{
    public ViewModel()
    {
        _persons = new ObservableCollection<Person>();
        _persons.Add(new Person() { Name = "Paul", Checked = false });
        _persons.Add(new Person() { Name = "Brian", Checked = true });
    }

    private ObservableCollection<Person> _persons;

    public ObservableCollection<Person> Persons
    {
        get { return _persons; }
    }
}

public class Person
{
    public String Name { get; set; }
    public Boolean Checked { get; set; }
}

您应该能够看到消息“Checked items=1”。 希望这会有所帮助

【讨论】:

  • 每当您使用VisualTreeHelper 时,您都可能在做某事错误。在这种情况下,可以通过绑定的对象轻松访问所需的值,而 WPF 中很少需要直接访问控件。
【解决方案2】:

由于它是 2 路绑定,我可以从列表框的项目源访问复选框选择的值。 数据表 lstBoxMarketItemSourceDT = ((DataView)lstBoxMarket.ItemsSource).ToTable();

检索到的数据表中的“Checked”列给出了更新后的复选框值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2015-05-02
    • 1970-01-01
    相关资源
    最近更新 更多