none
mvvm下,ListBox等列表控件的多选问题(ListBox.SelectedItemsProperty 字段) RRS feed

  • 问题

  • 发现有这个依赖属性,但是也看到了,xaml里没法写。

    到底是如何在mvvm下使用倒是一个问题……

    比如ListBox里绑的是一个   List<Music>

    如何获取多选Music?并添加到一个新的ListBox中?

    向大神请教,谢谢你们。


    Just 4 Love

    2013年8月7日 10:15

答案

  • Hi,

      欢迎来到MSDN中文论坛。

      我不是确定我能真正理解你所说的情况,这边我家顶你想要一个listbox名字叫Music,用来显示所有被选择的条目从另个叫MyOtherListbox中,你将需要设置绑定模式是单向的否则就会报错。 

    Music.SetBinding(ListBox.ItemsSourceProperty, new Binding { Source = MyOtherListbox.SelectedItems, Mode = BindingMode.OneWay});

    Jason Wang
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年8月8日 7:34
    版主

全部回复

  • Hi,

      欢迎来到MSDN中文论坛。

      我不是确定我能真正理解你所说的情况,这边我家顶你想要一个listbox名字叫Music,用来显示所有被选择的条目从另个叫MyOtherListbox中,你将需要设置绑定模式是单向的否则就会报错。 

    Music.SetBinding(ListBox.ItemsSourceProperty, new Binding { Source = MyOtherListbox.SelectedItems, Mode = BindingMode.OneWay});

    Jason Wang
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年8月8日 7:34
    版主
  • 你好谢谢你回复。

    我说的具体点吧……

    刚接触mvvm也不熟悉CommandParameter,我理想是一个ListBox一个Button,俩控件。

    按下按钮,VM就能获取到选择的列表。

    界面和逻辑已经完全分开,是不是就不能用x:name路由事件了是吧?

    只能用command+Parameter不是么。

    我现在的总结就是mvvm真的超不好用,很多路由命令和对象传递都不好搞,请赐予我几个文章吧,谢谢你Mr. Wang


    Just 4 Love

    2013年8月9日 4:33
  • Hi,

      你可以看下这些链接,或许对你有用。

      Model-View-ViewModel (MVVM) Explained

      MVVM (Model-View-ViewModel) Pattern For Windows Form Applications, using C# 

      WPF/MVVM Quick Start Tutorial

      Commands in MVVM

      如果你想知道为什么需要使用MVVM以及MVVM的概念,你可以参考:

      Understanding the basics of MVVM design pattern


    Jason Wang
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年8月16日 1:15
    版主
  • 你好谢谢你回复。

    我说的具体点吧……

    刚接触mvvm也不熟悉CommandParameter,我理想是一个ListBox一个Button,俩控件。

    按下按钮,VM就能获取到选择的列表。

    界面和逻辑已经完全分开,是不是就不能用x:name路由事件了是吧?

    只能用command+Parameter不是么。

    我现在的总结就是mvvm真的超不好用,很多路由命令和对象传递都不好搞,请赐予我几个文章吧,谢谢你Mr. Wang


    Just 4 Love

    不应该在 Button 中直接从 ListBox 获取选择的项,而是应该把 CommandParameter 绑定到选择项。

    使用 MVVM 模式的时候,需要先抛弃 UI ,而先建立 ViewModel 模型,例如在你的场景中,我假设你有个候选列表 AvailableListBox,一个已选列表控件:SelectedListBox,一个选择按钮:SelectButton,一个取消选择按钮:RemoveButton;

    1,点击 SelectButton 时,将 AvailableListBox 中选择的项移动到 SelectedListBox 中;

    2,点击 RemoveButton 时,将 SelectedListBox 中选择的项移回到 AvailableListBox 中;

    我们为界面建立一个 ViewModel:

    public class ViewModel{

    public ObservableCollection<MusicViewModel> AvailableMusics{get;set;} // 绑定到 AvailableListBox 的 ItemSource

    public ObservableCollection<MusicViewModel> SelectedMusics{get;set;} // 绑定到 SelectedListBox 的 ItemSource

    public ObservableCollection<MusicViewModel> SelectingMusics{get;set;} // 绑定到 AvailableListBox 的 SelectedItems 和 SelectButton 的 Command Parameter

    public ObservableCollection<MusicViewModel> RemovingMusics{get;set;} // 绑定到 SelectedListBox 的 SelectedItems 和 RemoveButton 的 Command Parameter

    }

    SelectingMusics 集合的记录数可以控制 SelectButton 的 Enable 属性,RemoveButton 同理。如果使用 Prism 的框架,这里的 Command 绑定、控制会比较简单。

    SelectButton Execute 时,会将绑定的参数表示的集合中的项从 AvailableMusics 中移动到 SelectedMusics 中;

    RemoveButton  Execute 时,会将绑定的参数表示的集合中的项从 SelectedMusics 中移回到 AvailableMusics 中;

    2013年8月16日 1:47