【问题标题】:Caliburn micro listbox multiple selection MVVMCaliburn 微列表框多选 MVVM
【发布时间】:2019-02-26 07:02:34
【问题描述】:

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

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>

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

【问题讨论】:

    标签: wpf mvvm caliburn.micro multipleselection


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      相关资源
      最近更新 更多