【发布时间】: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