所以我试图在一个简单的示例应用程序中实现MVVM模式。基本上我的应用程序允许用户从SettingsPage中的搜索提供程序列表中进行选择,然后在用户单击“搜索”时在主页中进行选择。按钮他或她将被导航到搜索提供商的网站。一切似乎都运行正常,没有错误,除非从SettingsPage直接导航回MainPage,搜索属性似乎没有更新。当应用程序完全退出并重新启动时,一切都很好。我所拥有的如下
MainPage.xaml.cs中
void search_Click(object sender, EventArgs e)
{
TheBrowser.Navigate(App.ViewModel.SearchProvider.Address);
}
App.xaml.cs
private static MainViewModel viewModel = null;
public static MainViewModel ViewModel
{
get
{
// Delay creation of the view model until necessary
if (viewModel == null)
viewModel = new MainViewModel();
return viewModel;
}
}
MainViewMode.cs
public ListItem SearchProvider { get; private set; }
public MainViewModel()
{
SearchProvider = Settings.SearchProvider.Value;
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (null != handler)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
在我的“设置”页面中,我允许用户选择搜索提供商
SettingsPage.xaml.cs
private void PopulateSearchProviderList()
{
searchProviderList = new ObservableCollection<ListItem>();
searchProviderList.Add(new ListItem { Name = "Bing", Address = "http://www.bing.com" });
searchProviderList.Add(new ListItem { Name = "Google", Address = "http://www.google.com" });
SearchProviderListPicker.ItemsSource = searchProviderList;
}
private void stk_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
if (SearchProviderListPicker.SelectedIndex != -1)
{
var selectedItem = (sender as StackPanel).DataContext as TestApp.Classes.ListItem;
Settings.SearchProvider.Value = selectedItem; //Setting the search provider
}
}
最后我的ListItem类非常简单
ListItem.cs
public string Name
{
get;
set;
}
public string Address
{
get;
set;
}
基本上我没有根据SettingsPage正确更新ViewModel,但我不确定如何正确地解决这个问题。
答案 0 :(得分:0)
您必须在UI中调用要更新的项目OnNotifyPropertyChanged("propertyName")
。
例如(假设Name
和Address
属性绑定到UI元素。)
private string name;
private string address;
public string Name
{
get { return name;}
set {
name = value;
OnNotifyPropertyChanged("Name");
}
}
public string Address
{
get { return address; }
set {
address = value ;
OnNotifyPropertyChanged("Address");
}
}
答案 1 :(得分:0)
我可以看到一些问题。我们将从那里开始。
INotifyPropertyChanged
,请参阅here SearchProvider
二传手需要加注PropertyChanged
SearchProvider
的值。目前,这只是在构造函数中执行,这可能就是为什么你只看到在app启动时工作的原因。SearchProvider
的值。如果您发布了xaml,我们也可以检查它。在ViewModel中,添加:
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string caller = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(caller));
}
}
将SearchProvider属性更新为:
private ListItem searchProvider;
public ListItem SearchProvider
{
get { return searchProvider; }
set
{
searchProvider = value;
OnPropertyChanged();
}
}