【问题标题】:Visual Studio Listview binding selected item two ways MVVMVisual Studio Listview 绑定选中项的两种方式 MVVM
【发布时间】: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?

【问题讨论】:

    标签: c# wpf list mvvm binding


    【解决方案1】:

    我认为您的 List 集合是问题所在。你能给我List对象的定义吗?是旅馆名字的集合还是旅馆的集合?

    在您的场景中需要做的一件事是 List 应该是字符串类型的集合。也就是说,您的 ListViewItemSource 应该包含旅馆的“字符串”类型名称的集合。当您选择其中之一时,它将返回将分配给 NewReservation.hostelName 的选定名称。

    【讨论】:

    • 这能解决你的目的吗@lukas..!!?如果是,请将其标记为答案。
    猜你喜欢
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    相关资源
    最近更新 更多