繁体   English   中英

获取ComboBox(MVVM)的SelectedItem

[英]Getting SelectedItem of ComboBox (MVVM)

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

XAML:

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

视图模型:

public Room SelectedRoom { get; set; }

但这是行不通的-唯一发生的是该ComboBox周围出现红色边框-此外,在ComboBox中选择了一个新项目之后,我的VM中的“ SelectedRoom”属性仍然为null。

编辑1:

还有一个简短的问题:

绑定工作正常-至少对于顶部的“类别”而言。 我的包装器类还包含一个储物柜列表。

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

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

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

编辑2(解决方案):

好,知道了!

正如我发现的那样,我已经重置了DataContext-现在当然找不到Property SAVM。

解:

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

红色框表示Binding出现验证错误,最常见的错误是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}" />

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM