【问题标题】:Getting Only one Selected Item from Listbox从列表框中仅获取一个选定项
【发布时间】:2016-01-08 06:43:53
【问题描述】:

我正在使用 wpf 中的列表框。我的问题是我只从列表框中获取一个选定的项目。我想获取所有选定但不知道如何实现的项目?请帮忙! 这是我的代码:

<ListBox ItemsSource="{Binding Markets}" BorderThickness="0" Background="{x:Null}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" SelectionMode="Multiple" SelectedItem="{Binding SelectedItem}">
     <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel IsItemsHost="True" />
            </ItemsPanelTemplate>
     </ListBox.ItemsPanel>
     <ListBox.ItemTemplate>
            <DataTemplate>
                <CheckBox Content="{Binding}" Style="{DynamicResource CheckBoxStyle1}" Width="140" Margin="10"/>
            </DataTemplate>
     </ListBox.ItemTemplate>
</ListBox>

这是我的视图模型内容:

    private string _selectedItem;
    public List<string> Markets { get; set;}
    public SettingVM()
    {

        Markets = new List<string>();
        Markets.Add("United Kingdom");
        Markets.Add("Australia");
    }
    public string SelectedItem
    {
        get
        {
            return _selectedItem;
        }
        set
        {
            Set(() => SelectedItem, ref _selectedItem, value);
        }
    }     

【问题讨论】:

  • 您可以使用 ListBox.SelectionMode="Multiple" 和 ListBox.SelectedItems 来访问选定的项目。
  • 我不知道,但你可以试试这个:littlebigtomatoes.com/2013/02/…
  • 如何使用或绑定 Listbox.SelectedItems ? @tgpdyk
  • ListBox.SelectedItems 是只读的,所以你不能设置Binding。您应该选择自己的自定义AttachedProperty。
  • 我只是想获取项目字符串,那么如何实现呢? @AnjumSKhan

标签: c# .net wpf listbox viewmodel


【解决方案1】:

您可以将SelectedItem listobx 属性直接绑定到您的视图模型,但不能将SelectedItems 属性绑定。

我使用与委托命令相关的行为来实现这一点(包含在 Prism 框架中)

你的对象

class MyObject
{

}

行为

internal class MyObjectSelectionChangedToCommand
{

    public static readonly DependencyProperty SelectionCommandProperty =
        DependencyProperty.RegisterAttached("SelectionCommand", typeof(DelegateCommand<GridSelectionInfo<MyObject>>),
        typeof(ResourceCardGridSelectionChangedToCommand), new PropertyMetadata(null, OnSelectionCommandChanged));

    public static DelegateCommand<GridSelectionInfo<MyObject>> GetSelectionCommand(DependencyObject obj)
    {
        return (DelegateCommand<GridSelectionInfo<MyObject>>)obj.GetValue(SelectionCommandProperty);
    }

    public static void SetSelectionCommand(DependencyObject obj, DelegateCommand<GridSelectionInfo<MyObject>> value)
    {
        obj.SetValue(SelectionCommandProperty, value);
    }

    private static void dg_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var tsci = new GridSelectionInfo<MyObject>
        {
            Added = e.AddedItems.Cast<MyObject>().ToList(),
            Removed = e.RemovedItems.Cast<MyObject>().ToList(),
            Selected = ((ListBox)sender).SelectedItems.Cast<MyObject>().ToList()
        };

        var cmd = GetSelectionCommand((DependencyObject)sender);
        cmd.Execute(tsci);
    }

    private static void OnSelectionCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var dg = d as ListBox;

        if (dg != null) dg.SelectionChanged += dg_SelectionChanged;
    }
}

public class GridSelectionInfo<T>
{
    public GridSelectionInfo()
    {
        Selected = new List<T>();
        Added = new List<T>();
        Removed = new List<T>();
    }

    public List<T> Added { get; set; }

    public List<T> Removed { get; set; }
    public List<T> Selected { get; set; }

    public override string ToString()
    {
        return string.Format("Added: {0}, Removed: {1}, Selected: {2}", Added.Count, Removed.Count, Selected.ToFormattedString());
    }
}

将视图模型命令绑定到行为的 XAML 部分

<ListBox  ItemsSource="{Binding MyCollection}"
 resources:ResourceCardGridSelectionChangedToCommand.SelectionCommand="{Binding CmdObjectSelectionChanged}">
</ListBox>

然后,在您的视图模型中,您只需声明命令

public DelegateCommand<GridSelectionInfo<MyObject>> CmdObjectSelectionChanged { get; private set; }

然后创建它

CmdObjectSelectionChanged = new DelegateCommand<<GridSelectionInfo<MyObject>>(ExecuteSelect,CanExecuteSelect);

因此,每次列表框中的选择发生变化时,您都会收到包裹在 GridSelectionInfo 对象中的执行委托中有关所选项目的所有信息;

【讨论】:

    【解决方案2】:

    也许对你有帮助

    您可以在 ListBox.SelectedItems 中找到它们。使用foreach

    foreach (ListItem li in listBox1.SelectedItems)
    {
    // your code here
    }
    

    【讨论】:

      【解决方案3】:

      您使用“SelectedItem="{Binding SelectedItem}">”。根据MSDN“获取或设置当前选择中的第一项或如果选择为空则返回null”

      您需要将 SelectedItems 绑定到视图模型中的列表。

      【讨论】:

      • 如何绑定 SelectedItems ?在列表框中,我只得到 SelectedItem 属性
      • 如果我在视图模型中创建一个属性,例如“public List SelectedItems{get;set;},那么如何将它绑定到 ???
      【解决方案4】:

      在 ListBox 控件中,SelectedItems 属性是只读的,但您可以添加一个行为来完成这项工作,请参阅此答案:https://stackoverflow.com/a/8369532/1431524

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题,当我绑定到 SelectedItems 时,在某些情况下属性没有通知模型!我结束了使用非持久属性(“Selected”)扩展我的实体,然后将此属性绑定到 CheckBox 的 IsCheched 属性。 在您的情况下,创建另一个分部类文件 Market 来扩展 Market 对象,添加一个新的 bool 属性(例如 Selected),然后在您的复选框中绑定此属性:

        <CheckBox Content="{Binding}" IsChecked="{Binding Selected}" Style="{DynamicResource CheckBoxStyle1}" Width="140" Margin="10"/>
        

        【讨论】:

          猜你喜欢
          • 2016-02-02
          • 2011-08-23
          • 1970-01-01
          • 1970-01-01
          • 2012-03-14
          • 2011-02-26
          • 1970-01-01
          • 2010-09-23
          • 2021-11-18
          相关资源
          最近更新 更多