【问题标题】:Getting SelectedItem Issue on ComboBox - MVVM ObservableCollection在 ComboBox 上获取 SelectedItem 问题 - MVVM ObservableCollection
【发布时间】:2015-02-11 11:41:12
【问题描述】:

首先,对于任何可能觉得这是一个非常愚蠢的问题或已经回答的问题的人,我深表歉意。我对 MVVM、XAML 非常陌生,并且阅读了 StackOverflow 上的所有内容,但我仍然无法理解我确定是一个简单的概念。

所以我设置了一个 MVVM,其中一个 Observable Collection 被放入一个 ComboBox 中。这是视图。

public class AppSettings : INotifyPropertyChanged
{
    public class Regions
    {
        public int code { get; set; }
        public string region { get; set; }
    }

    private ObservableCollection<Regions> _ItemsRegions = new ObservableCollection<Regions>
    {
        new Regions() { code = 0, region = "Metro : All Areas" },
        new Regions() { code = 25, region = "Metro : North of River"},
        new Regions() { code = 26, region = "Metro : South of River"},
        new Regions() { code = 27, region = "Metro : East/Hills"},
    };
    public ObservableCollection<Regions> Region
    {
        get { return this._ItemsRegions; }
    }

    private Regions _selectedRegion;
    public Regions SelectedRegion
    {
        get { return _selectedRegion; }
        set
        {
            if (value != _selectedRegion)
            {
                _selectedRegion = value;
                RaisePropertyChanged("SelectedRegion");
            }
        }
    }

作为参考,这是我的 ComboBox。

<ComboBox Name="Regions" ItemsSource="{Binding Region}" DisplayMemberPath="region" SelectedItem="{Binding SelectedRegion, Mode=TwoWay}"/>

现在好消息是,我的 SelectedItem 正在工作,并且我能够使用 MVVM 获得我需要进行更改等的值,这太棒了!这个概念起初有点难以理解,但一旦我掌握了它,我就知道发生了什么。所以此时我可以以任何方式保存数据……最终的计划是将其放入漫游数据中。这是一个通用应用程序。

所以问题是用户完成了这个页面并离开它。当他/她回到它时,ComboBox 会加载所有数据(如预期的那样),但我刚刚保存的 SelectedItem 不是。如中,“IsSelected = True”项目为空,所以它只是说“选择一个项目”。

我需要做什么才能加载页面,从保存中获取 SelectedItem 并将其设置为 ComboBox。我一直很愚蠢,并尝试将 Region.ComboBox.SelectedItem 设置为“字符串”,但这当然会破坏并破坏整个 MVVM 的目的!

那么,我需要做什么?我很高兴有人指出一些文档供我阅读。

更新编辑

因此,我在这里听从用户的建议;设置 INotifyPropertyChanged 逻辑并将其放入空白应用程序中。只是为了看看我没有做任何愚蠢的事情。

不幸的是,空白应用程序也存在同样的问题,即从页面导航并返回到它没有我之前选择的值...为了说明这一点,这里是一个快速截图。

要向后导航,我使用的是硬件后退按钮。

我猜我只是缺少一块拼图来完成这项工作。整个 MVVM XAML 概念对我来说是新的,虽然我学到了很多东西,但我真的坚持下去了!

有接受者吗?尖端?想法?例子?

更新 2

好的,所以按照 cmets 中关于这个问题的更多建议,我在“this._selectedRegion”的对象 ID 上添加了一个调试器跟踪。

当用户从组合框中选择一项时,对象 ID 的监视显示数据实际上设置正确。伟大的!但是当用户离开页面并返回时,它被设置为空。不好!

以我平淡/愚蠢的脸庞,我完全没有抓住重点吗?我是否打算在“OnNavigatedTo”又名,首先加载自己为组合框设置 SelectedItem?由于数据永远不会在导航时保存并返回到它是设置为 null 实际上在 MVVM 中是预期的吗?我是否操纵“get”语句并指定它应该是的 ObservableCollection 项?粗鲁的方式,但喜欢

_selectedRegion = something return _selectedRegion

这对我来说听起来非常粗糙,而不是应该的,但也许我只是不欣赏正确设置的 MVVM?

有人想吗?

【问题讨论】:

  • 您确定在 用户回来之前将 ViewModel 中的 SelectedRegion 设置为 _ItemsRegions 中的一项吗?
  • 旁注:我认为应该是public class Region(单数)
  • 嗨@DrKoch。为了回答您的第一条评论,我很确定我能够获得 _ItemRegion 的值。例如var mes = new MessageDialog(_selectedRegion.code.ToString()); mes.ShowAysnc() 使值出现在消息框中。对于旁注。这不是Public class Region吗?我应该加倍和复制区域吗?
  • 不,我只是发现您对单数/复数形式的使用令人困惑:类应该是“MyRegion”列表“MyRegions”。我说:设置 SelectedItem
  • @DrKoch,为单数/复数形式道歉。这只是一个匆忙的工作,我确实从互联网上的示例中将它们混合在一起。你能在Set SelectedItem 上解释一下吗?我在这里遗漏了一些代码逻辑吗?

标签: c# xaml mvvm observablecollection selecteditem


【解决方案1】:

对于 WPF 中的 ComboBox,将 SelectedItem 设置为 ItemsSource 中的一项非常重要。

确保SelectedItem 具有正确的值(或设置)当他/她回来时


编辑

你的绑定

SelectedItem="{Binding SelectedRegion, Mode=TwoWay}"

在构建控件时将调用SelectedRegion 的getter。当 ComboBox 中的值发生变化时,它会调用 setter。

【讨论】:

  • 感谢您的回答,但需要澄清一下,我该如何检查?我可以看到的 SelectedItem 来自 itemsource 的数据绑定?正如在值匹配选项之一!
  • SelectedRegion的getter和setter中设置断点。观察当用户离开回来时会发生什么
  • 他们按预期发射/或者我没有看到它有问题。导航到页面“获取”并使用适当的断点从列表“设置”中进行选择。有没有办法检查get上的数据?看看它试图将选定项设置为什么?
  • 绑定到位后,属性值应始终是组合框中的可见值(只要 ItemsSource 正确)
  • 但不是吗?感谢您的编辑,这也是我所理解的,但是在返回页面时未设置 SelectedItem。还有更多建议?构建调用正在擦除值并重新加载它以及在 SelectedItem 尝试设置的时间之间是否存在问题?我被困在这个问题上,因为似乎 StackOverflow 上没有其他人有这个问题。
猜你喜欢
  • 2015-03-13
  • 2012-06-19
  • 2016-09-25
  • 2017-02-20
  • 2014-03-18
  • 1970-01-01
  • 2011-07-04
  • 2013-11-07
  • 1970-01-01
相关资源
最近更新 更多