首页 文章

获取ComboBox的SelectedItem(MVVM)

提问于
浏览
1

我想使用MVVM模式(初学者)获取ComboBox的选定项目 . 我已经读过这可以通过将SelectedItem属性绑定到ViewModel中的Property来实现 .

XAML:

<ComboBox ItemsSource="{Binding RoomLockerLinkCollection}" 
        DisplayMemberPath="Room.Name" 
        SelectedItem="{Binding SelectedRoom}"/>

视图模型:

public Room SelectedRoom { get; set; }

但它不起作用 - 唯一发生的事情是ComboBox周围出现红色边框 - 此外,在ComboBox中选择一个新项目之后,我的VM中的“SelectedRoom”属性仍为空 .

编辑1:

一个简短的附加问题:

绑定工作正常 - 至少对于顶级“类别” . My Wrapper-Class还包含一个储物柜列表 .

<ComboBox DataContext="{Binding SelectedItem, ElementName=_cmbRoomSelection}" ItemsSource="  {Binding LockerCollection}" DisplayMemberPath="Name" SelectedValue="{Binding SAVM.SelectedLocker, Mode=TwoWay}" />

当我检查SelectedValue的类型时,它是一个“Locker” - 很好 . 但我的VM中的SelectedLocker-Property保持为null ...

另外,可以s.o . 解释何时使用“SelectedItem”和“SelectedValue”?有什么不同?在上面的xaml代码中设置DataContext不能通过绑定SelectedValue来完成...

编辑2(解决方案):

好,知道了!

当我发现我已经重置了我的DataContext时 - 现在找不到属性SAVM了 .

解:

<ComboBox DataContext="{Binding SelectedItem, ElementName=_cmbRoomSelection}" 
ItemsSource="{Binding LockerCollection}" 
DisplayMemberPath="Name" 
SelectedValue="{Binding SAVM.SelectedLocker **ElementName=_vStorage**, Mode=TwoWay}" />

1 回答

  • 2

    红色框表示绑定的验证错误,最常见的错误是BindingSource和BindingTarget的类型不同 .

    使用SelectedValue和SelectedValuePath绑定到Room对象 .

    CS:

    public class Room
    {
        public string RoomName { get; set; }
    }
    
    public class RoomWrapper
    {
        public Room Room { get; set; }
    }
    
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this; 
        }
    
    
        public List<RoomWrapper> RoomWrappers
        {
            get
            {
                var list = new List<RoomWrapper>();
                for (int i = 0; i < 10; i++)
                {
                    list.Add(new RoomWrapper { Room = new Room { RoomName = "Room " + i } });    
                }
    
                return list;
            }
        }
    
        private Room selectedRoom;
        public Room SelectedRoom
        {
            get { return selectedRoom; }
            set
            {
                selectedRoom = value;
            }
        }
    

    XAML:

    <ComboBox ItemsSource="{Binding RoomWrappers}" 
               DisplayMemberPath="Room.RoomName"
               SelectedValuePath="Room" 
               SelectedValue="{Binding SelectedRoom, Mode=TwoWay}" />
    

相关问题