【问题标题】:Getting SelectedItem of ComboBox (MVVM)获取 ComboBox 的 SelectedItem (MVVM)
【发布时间】:2015-03-13 12:32:02
【问题描述】:

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

XAML:

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

视图模型:

public Room SelectedRoom { get; set; }

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

编辑 1:

一个简短的附加问题:

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

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

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

附加的,可以。解释何时使用“SelectedItem”和“SelectedValue”?有什么不同?上面xaml代码中设置DataContext不能通过绑定SelectedValue来实现...

编辑 2(解决方案):

好的,明白了!

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

解决方案:

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

【问题讨论】:

  • 红框表示验证错误,你的属性和你的ItemsSource可能不是同一类型。
  • 天哪,你说的太对了 - 在将属性的类型设置为 object 以检查我使用的是哪种类型之后,我意识到我正在为此使用包装器......有没有办法将选定项的属性链接到我的 mv 中的属性?例如我的组合框包含 roomLockerLink 类型的对象,其中包含一个房间和一个储物柜列表 - 但我想提取包含房间以将其保存在我的 mv 属性中。希望能得到我想说的......
  • 是的,一秒钟我会写一个答案。与此同时,阅读 SelectValue 和 SelectedValuePath
  • 发布 LockerCollection 和 SelectedLocker 属性。此外,搜索如何检测 wpf 中的绑定错误。使用正确的工具很容易检测到某些内容未通过绑定更新的原因。 Snoop 或 Visual Studio 的输出窗口。

标签: c# wpf xaml mvvm combobox


【解决方案1】:

红色框表示来自 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}" />

【讨论】:

  • 非常感谢。你能解释一下为什么要使用双向绑定吗?因为我只是想获得一个选定的值不会做“OneWayToSource”的工作吗?
  • @Chill-X 它会......但这会让你选择从你的代码中设置它。
  • 双向绑定是从用户界面到绑定属性,从绑定属性或对象到用户界面。请查看此内容以获取更多信息;stackoverflow.com/questions/2305179/….
猜你喜欢
  • 1970-01-01
  • 2012-06-19
  • 2016-09-25
  • 2017-02-20
  • 2014-03-18
  • 1970-01-01
  • 2013-11-07
  • 2018-08-04
  • 1970-01-01
相关资源
最近更新 更多