2015-01-15 12 views
0

Я хотел бы получить выбранный элемент ComboBox с использованием шаблона MVVM (новичок). Я читал, что это может быть достигнуто путем привязки свойства SelectedItem к свойству в ViewModel.Получение SelectedItem из ComboBox (MVVM)

XAML:

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

ViewModel:

public Room SelectedRoom { get; set; } 

Но это не работает - единственное, что вот происходит это появляется красная кайма вокруг этого ComboBox - в дополнение после выбора нового элемента в ComboBox свойство «SelectedRoom» в моей VM по-прежнему равно null.

Edit 1:

Один короткий дополнительный вопрос:

связывания отлично работает - по крайней мере, для верхней "категории". My Wrapper-Class также содержит список шкафчиков.

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

Когда я проверяю тип SelectedValue, это «Locker» - отлично. Но свойство SelectedLocker в моей VM остается нулевым ...

Дополнительно, может s.o. объясните, когда использовать «SelectedItem» и «SelectedValue»? Какая разница? Установка DataContext в коде XAML выше, не может быть сделано путем связывания SelectedValue ...

Edit 2 (Solution):

Хорошо, есть!

Как я понял, я сбросил свой DataContext - теперь Property SAVM, конечно, не удалось найти.

Решение:

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

Красная коробка указывает на ошибку проверки, ваше имущество и ваши ItemsSource может не быть того же типа. –

+0

omg, вы так правы - после установки типа свойства для объекта, чтобы проверить, какой тип я использую, я понял, что я использую оболочку для этого ... Есть ли способ связать свойство выбранного элемента с собственность в моем mv? например в моем combobox хранятся объекты типа roomLockerLink, который содержит комнату и список блокировщиков, но я хотел бы извлечь содержащуюся комнату, чтобы сохранить ее в моем mv-свойстве. Надежда так получает то, что я хочу сказать ... – C4p741nZ

+0

Да, в один секунду я напишу ответ. В среднем, прочитав о SelectValue и SelectedValuePath –

ответ

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}" /> 
+0

Очень большое спасибо. Не могли бы вы объяснить, почему использовать двустороннюю привязку? Потому что я просто хочу получить выбранное значение, если бы «OneWayToSource» выполнял эту работу? – C4p741nZ

+0

@ Chill-X это было бы ... Но это даст вам возможность установить его из вашего кода. –

+0

привязка TwoWay от пользовательского интерфейса к связанному свойству и от связанного свойства или объекта с пользовательским интерфейсом. Пожалуйста, просмотрите это для получения дополнительной информации: https: //stackoverflow.com/questions/2305179/what-are-the-various-wpf-binding-modes. –

Смежные вопросы