Caliburn微型列表框多选MVVM

时间:2018-09-21 20:59:35

标签: wpf mvvm caliburn.micro multipleselection

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

  

ViewModel.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)); }
  }
}
  

View.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>

由于 SelectedListOfPeople 不会在将ListBox中的第二项选择为多项选择时调用,因此如何确保每次用户进行在列表框中选择。 先谢谢了。

1 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是打破该框架中可用的约定,并手动绑定属性。

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

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将提供所需的行为。