【发布时间】:2014-11-29 14:07:52
【问题描述】:
我对 C sharp 和所有 MVVM 东西都很陌生,我试图解决我的问题,但经过几天的搜索没有结果,所以我在这里写。我有预订和添加旅馆的程序。首先,您可以在一个 View 页面上添加 Hostel - 它会将其添加到 SQLite 数据库,然后添加到 hostels 列表中。在第二个查看页面上,我得到了预订旅馆的公式。在选择您要预订的旅馆时,我有一个包含旅馆列表的列表视图。我将 ItemSource 绑定到 List(旅馆列表),所以我可以看到那里的所有旅馆,但是当我想将 SelectedItem 绑定到 NewReservation.HostelName 时 - 它不会做任何事情。这是列表视图的代码:
<StackPanel Orientation="Horizontal" Margin="0,0,0,0">
<TextBlock Text="Hostel name" Width="160" Margin="12,12,12,12" Height="20" Foreground="Black" FontFamily="Microsoft JhengHei Light" FontSize="18" />
<ListView Margin="10,0,0,0" Width="223" ItemsSource="{Binding List}" SelectedItem="{Binding NewReservation.hostelName, Mode=TwoWay}" Height="100" Background="#FFD3DCC1" Foreground="#FF183440" RequestedTheme="Dark" Padding="5,5,5,0">
<ListView.DataContext>
<viewModel:ViewModel/>
</ListView.DataContext>
</ListView>
</StackPanel>
这个程序作为 MVVM 运行,所以在 ViewModel 中我定义了 New Reservation 如下:
public Reservation NewReservation
{
get { return _newReservation; }
set
{
_newReservation = value;
NotifyPropertyChanged("NewReservation");
}
}
我还有一个名为 Reservation 的类,其中包含许多字段 - 但我只想更新 hostelName,这样当用户预订旅馆时,他只会从旅馆的列表视图中进行选择,并且所选项目绑定的名称NewReservation.hostelName 的旅馆 - Mode=TwoWay 也在那里,所以我认为它应该真的可以工作。
问题是,当我也调试这个程序并逐步检查每一行代码时,我发现它不会填充 NewReservation.hostelName。我也用 ComboBox 试过这个,但也没有结果。有趣的是,我还有其他列表视图 - 仅用于查看旅馆的详细信息(用户从列表视图中选择一个旅馆,然后它在文本块中显示数据 - 这工作正常)。但我真的不知道如何将旅馆的名称从 listview 发送到 NewReservation。当我像文本框一样拥有它时 - 因此用户必须手动输入旅馆的名称 - 它工作正常 - 它将文本从文本框绑定到 NewReservation.hostelName 并且一切正常。但由于某种原因,我不能使用列表框或组合框来做到这一点......
我也在考虑我将在 viewmodel 中创建一个 SelectedHostelReservation 并绑定到这个人,然后将数据从它发送到 NewReservation.hostelName - 但这让我觉得这没用,并且让程序变得更长去做吧。
那么我是否缺少连接它们的东西或绑定中的一些逻辑?我真的不知道..谢谢你的任何回答。
这是请求的更新,很抱歉回复晚了: List 的声明代码是这样的
private ObservableCollection<Hostel> _list;
public ObservableCollection<Hostel> List
{
get { return _list; }
set
{
_list = value;
NotifyPropertyChanged("List");
}
}
所以它是 Hostel 类的可观察集合——hostel 类的代码只是简单的模型事物,具有姓名、电话、电子邮件等属性......
然后我们有预订类,它具有名称(但现在是预订旅馆的人),hostelName - 这是我们要预订的旅馆的名称,以及许多其他属性...... 我已经将堆栈面板的上下文设置为 ViewModel - 还定义了这个 ObservableCollection(上图)以及 NewReservation 的东西......所以当我说我需要将项目源绑定到 ObservableCollection 列表,然后是选定的项目到 NewReservation.hostelName, Mode=TwoWay - 它应该将数据发送到 NewReservation 不是吗?或者我应该做一些类似于 substep 的东西——也许是首先绑定的东西——比如 SelectedHostelName,然后将其发送到 NewReservation.hostelName?
【问题讨论】: