在ComboBox上获取SelectedItem问题 - MVVM ObservableCollection

时间:2015-02-11 11:41:12

标签: c# xaml mvvm observablecollection selecteditem

首先,我向任何可能觉得这是一个非常愚蠢的问题或已经回答过的问题的人道歉。我是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逻辑并将其放在一个空白的应用程序中。只是为了看到我没有做任何愚蠢的事情。

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

要导航回来,我正在使用硬件后退按钮。

Screenshot of what's happening

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

任何接受者?提示?想法?实例

更新2

好的,在关于这个问题的评论中发布了一些更多的建议后,我去了“this._selectedRegion”的对象ID上添加了一个调试器轨道。

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

凭借我平淡无奇的脸,我完全错过了这一点?我本来打算“OnNavigatedTo”又名,拳头加载设置组合框的SelectedItem我自己?因为在数据中永远不会保存在导航上并返回到它,因此在MVVM中实际上预期设置为null?我是否操纵“get”语句并指定它应该是的ObservableCollection项?粗暴的方式,但喜欢

_selectedRegion = something return _selectedRegion

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

有人想到吗?

1 个答案:

答案 0 :(得分:0)

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

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

<小时/> 的修改

你的绑定

SelectedItem="{Binding SelectedRegion, Mode=TwoWay}"
在构建控件时,

将调用SelectedRegion的getter。当ComboBox中的值发生变化时,它将调用setter。