2015-01-15 101 views
0

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

XAML:

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

视图模型:

public Room SelectedRoom { get; set; } 

但它不工作 - 这就是发生的唯一的事情就是围绕着组合框一出现红色边框 - 除了在选择新项目后,组合框中的“SelectedRoom”属性仍然为空。

编辑1:

一个短的附加问题:

的结合工作正常 - 至少在顶部的 “类别”。我的包装类还包含储物柜列表。

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

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

另外,可以s.o.解释何时使用“SelectedItem”和“SelectedValue”?有什么不同?设置的DataContext在XAML代码上面无法通过绑定的SelectedValue做...

编辑2(解决方案):

好的,知道了!

因为我发现我重置了我的DataContext - 现在属性SAVM当然无法找到。

解决方案:

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

红色框指示验证错误,你的财产和你的ItemsSource可能不是同一类型。 –

+0

omg你是如此的正确 - 在设置属性的类型来反对我检查使用哪种类型后,我意识到我正在使用这个包装...有没有办法将selecteditem的属性链接到在我的MV的财产?例如我的组合框包含一个roomLockerLink类型的对象,它包含一个房间和一个储物柜列表 - 但是我想提取包含空间的房间以将其保存在我的mv属性中。希望如此得到我想说的话...... – C4p741nZ

+0

是的,一秒钟我会写一个答案。 同时阅读有关SelectValue和SelectedValuePath –

回答

1

红色框是从你的绑定验证错误的指示, 最常见的错误将是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}" /> 
+0

非常感谢。你能解释为什么要使用双向绑定?因为我只想得到一个selectedvalue不会做一个“OneWayToSource”做这项工作? – C4p741nZ

+0

@ Chill-X它会......但是这会让你选择从你的代码中设置它。 –

+0

双向绑定是从用户界面到绑定属性以及从绑定属性或对象到用户界面。请查看以获取更多信息; https://stackoverflow.com/questions/2305179/what-are-the-various-wpf-binding-modes。 –