获取 ComboBox 的 SelectedItem (MVVM)
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" 属性 仍然存在空。
编辑 1:
一个简短的附加问题:
绑定工作正常 - 至少对于顶部 "category"。我的 Wrapper-Class 还包含一个储物柜列表。
<ComboBox DataContext="{Binding SelectedItem, ElementName=_cmbRoomSelection}" ItemsSource=" {Binding LockerCollection}" DisplayMemberPath="Name" SelectedValue="{Binding SAVM.SelectedLocker, Mode=TwoWay}" />
当我检查 SelectedValue 的类型时,它是 "Locker" - 很好。
但是我的 VM 中的 SelectedLocker-属性 保持为空...
另外,可以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}" />
红框表示您的 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}" />
我想使用 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:
一个简短的附加问题:
绑定工作正常 - 至少对于顶部 "category"。我的 Wrapper-Class 还包含一个储物柜列表。
<ComboBox DataContext="{Binding SelectedItem, ElementName=_cmbRoomSelection}" ItemsSource=" {Binding LockerCollection}" DisplayMemberPath="Name" SelectedValue="{Binding SAVM.SelectedLocker, Mode=TwoWay}" />
当我检查 SelectedValue 的类型时,它是 "Locker" - 很好。 但是我的 VM 中的 SelectedLocker-属性 保持为空...
另外,可以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}" />
红框表示您的 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}" />