从WPF中的列表框中获取复选框项

zqry0prt  于 2023-03-24  发布在  其他
关注(0)|答案(2)|浏览(284)

我正在开发WPF应用程序。在其中我添加CheckBoxesListBox以下方式。

foreach (User ls in lst)
{
     AddContacts(ls, lstContactList);
}

private void AddContacts(User UserData, ListBox lstbox)
{
    try
    {
        var txtMsgConversation = new CheckBox()
        {

                Padding = new Thickness(1),
                IsEnabled = true,
                //IsReadOnly = true,
                Background = Brushes.Transparent,
                Foreground = Brushes.White,
                Width = 180,
                Height = 30,
                VerticalAlignment = VerticalAlignment.Top,
                VerticalContentAlignment = VerticalAlignment.Top,
                Content = UserData.Name, //+ "\n" + UserData.ContactNo,
                Margin = new Thickness(10, 10, 10, 10)
        };

        var SpConversation = new StackPanel() { Orientation = Orientation.Horizontal };

        SpConversation.Children.Add(txtMsgConversation);

        var item = new ListBoxItem()
        {
                Content = SpConversation,
                Uid = UserData.Id.ToString(CultureInfo.InvariantCulture),
                Background = Brushes.Black,
                Foreground = Brushes.White,
                BorderThickness = new Thickness(1),
                BorderBrush = Brushes.Gray
        };

        item.Tag = UserData;

        lstbox.Items.Add(item);
    }
    catch (Exception ex)
    {
        //Need to log Exception
    }
}

现在我需要从ListBox中获取选中的项目。我如何在这里进行,我尝试了下面的代码,返回null,

CheckBox chkBox = lstContactList.SelectedItem as CheckBox;

有什么想法?

a5g8bdjr

a5g8bdjr1#

在列表框中创建动态多个项的方法不是在代码隐藏中,而是为项创建一个模板,然后将其绑定到项列表。

示例

假设我有一堆段落List<Passage> Passages { get; set; }

public class Passage
{
  public string Name { get; set; }
  public bool IsSelected { get; set; }
}

在我的xaml中,我创建了一个模板并绑定到它

<ListBox ItemsSource="{Binding Passages}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel  Orientation="Horizontal">
                <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}" />
                <TextBlock Text="{Binding Path=Name, StringFormat=Passage: {0}}"
                           Foreground="Blue" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我的四个段落“Alpha”,“Beta”,“Gamma”和“I-25”的结果看起来像这样:

然后,如果我想要所选的项目,例如上面最近选中的Beta,我只需枚举所选项目的List。

var selecteds = Passages.Where(ps => ps.IsSelected == true);

需要在一个列表框中列出不同类型的对象吗?比如从绑定到复合集合或ObservableCollection<T>
在这里看到我的答案:

1zmg4dgp

1zmg4dgp2#

谢谢你的回复,它帮助我找到了问题的答案。我唯一要添加的细节是使用'Window.DataContext'将结果绑定到List。

<Window.DataContext>
    <Binding RelativeSource="{RelativeSource Self}"/>
</Window.DataContext>

相关问题