首页 > 解决方案 > Caliburn 微列表框多选 MVVM

问题描述

我有一个包含名称的列表框。现在我需要从 ListBox 中选择多个项目。

视图模型.CS

private Person selectedListOfPeople_;
public Person SelectedListOfPeople
{
  get
  { return selectedListOfPeople_;}
  set
  { this.SetProperty(ref selectedListOfPeople_, value, nameof(SelectedListOfPeople));}
}

private ObservableCollection<Person> listOfPeople_;
public ObservableCollection<Person> ListOfPeople
{
  get { return listOfPeople_; }
  set
  {
    this.SetProperty(ref listOfPeople_, value, nameof(ListOfPeople));
  }
}

public ShellViewModel()
{
  ListOfPeople = new ObservableCollection<Person>
  {
    new Person("ABC"),new Person("DEF"),new Person("GHI"),new Person("JKL")
  };
}


public class Person : Screen
{
  private string personName_;
  public string PersonName
  {
    get { return personName_; }
    set { this.SetProperty(ref personName_, value, nameof(PersonName)); }
  }

  public Person(string personName)
  {
    PersonName = personName;
  }

  private bool isSelected_;
  public bool IsSelected
  {
    get { return isSelected_; }
    set { this.SetProperty(ref isSelected_, value, nameof(IsSelected)); }
  }
}

视图.XAML

<Grid Width="500" Height="500" Background="LightBlue">
    <ListBox x:Name="ListOfPeople" SelectionMode="Multiple" Height="300" Width="300" Margin="120,100,80,100">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding PersonName}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ListBox>

在设置为Multiple selectionsSelectedListOfPeople中选择第二个项目时不会调用它。如何确保每次用户在 中进行选择时都会引发此事件?ListBoxListBox

标签: wpfmvvmcaliburn.micromultipleselection

解决方案


这样做的一种方法是打破该框架中可用的约定并手动绑定属性。

但首先您需要更新视图模型中的多选属性

private ObservableCollection<Person> selectedListOfPeople;
public ObservableCollection<Person> SelectedListOfPeople {
    get { return selectedListOfPeople; }
    set { this.SetProperty(ref selectedListOfPeople, value, nameof(SelectedListOfPeople)); }
}

private ObservableCollection<Person> listOfPeople;
public ObservableCollection<Person> ListOfPeople {
    get { return listOfPeople; }
    set { this.SetProperty(ref listOfPeople, value, nameof(ListOfPeople)); }
}

public ShellViewModel() {
    ListOfPeople = new ObservableCollection<Person> {
        new Person("ABC"),
        new Person("DEF"),
        new Person("GHI"),
        new Person("JKL")
    };
    SelectedListOfPeople = new ObservableCollection<Person>();
}

然后绑定到视图的 XAML 中的所需属性

<ListBox x:Name="ListOfPeople" SelectionMode="Multiple" 
        Height="300" Width="300" Margin="120,100,80,100"
        SelectedItems = "{Bining SelectedListOfPeople}"
    >
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding PersonName}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ListBox>

约定将绑定项目源或ListBox手动绑定SelectedItems将提供所需的行为。


推荐阅读