C# 如何将列表框所选项目分配给源属性

C# 如何将列表框所选项目分配给源属性,c#,wpf,data-binding,mvvm,xaml-binding,C#,Wpf,Data Binding,Mvvm,Xaml Binding,我希望在用户选择一个或多个项目时更新我的源属性。我已经尝试了绑定模式OneWayToSource,但这没有帮助。以下是XAML和ViewModel代码: <ListBox x:Name="ItemsListBox" SelectionMode="Multiple" Height="300" ItemsSource="{Binding ResultSet}" SelectedItem="{Binding SelectedItems,Mode=One

我希望在用户选择一个或多个项目时更新我的源属性。我已经尝试了绑定模式OneWayToSource,但这没有帮助。以下是XAML和ViewModel代码:

<ListBox  x:Name="ItemsListBox" SelectionMode="Multiple" Height="300" 
          ItemsSource="{Binding ResultSet}"
          SelectedItem="{Binding SelectedItems,Mode=OneWayToSource}">

private List<string> _selectedItems;
public List<string> SelectedItems
{
    get
    {
        return _selectedItems;
    }
    set
    {
        _selectedModeItems = value;
        NotifyPropertyChanged("SelectedItems");
    }
}

私人列表_selectedItems;
公共列表SelectedItems
{
得到
{
返回_selectedItems;
}
设置
{
_selectedModeItems=值;
NotifyPropertyChanged(“SelectedItems”);
}
}

我通过使用附加的行为采取了这种方法,它是有效的,但是有更简单的方法吗?

WPF ListBox有两个与当前所选项目相关的属性:

  • SelectedItem可用于绑定,绑定到第一个选定项
  • SelectedItems(末尾带有“s”)不可用于绑定
启用多选时,您希望访问SelectedItems,但遗憾的是无法绑定到它

您可以使用代码隐藏解决此限制。 创建一个名为SelectedItems的属性,该属性将包含所选内容,然后订阅SelectionChanged事件:

<ListBox  x:Name="ItemsListBox" SelectionMode="Multiple" Height="300" 
                          ItemsSource="{Binding ResultSet}" 
        SelectionChanged="ListBox_SelectionChanged">


private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    foreach (string item in e.RemovedItems)
    {
        SelectedItems.Remove(item);
    }

    foreach (string item in e.AddedItems)
    {
        SelectedItems.Add(item);
    }
}

私有无效列表框\u SelectionChanged(对象发送方,SelectionChangedEventArgs e)
{
foreach(e.RemovedItems中的字符串项)
{
选择编辑项。删除(项);
}
foreach(e.AddedItems中的字符串项)
{
选择编辑项。添加(项);
}
}

你的问题应该是这样的

如何使用MVVM从WPF中的列表框中获取多个选定项

好的,您可以从下面的stackoverflow线程中得到答案


只需在ResultSet视图模型中定义
IsSelected
属性即可。然后,如果您想在任何时候获取所选项目,只需从结果集中获取“IsSelected”属性设置为true的项目。

您还可以创建附加行为

下面是一个操作方法

NotifyPropertyChanged(“SelectedItems”);可能应更改NotifyPropertyChanged(“SelectedItems”);这只是编辑问题、更新问题时的拼写错误。ThanksGood One,如果您使用命令绑定更改了选择,则会将其标记为应答。将使用绑定更新代码,让我们看看。代码隐藏不是一个好主意