C# 如何从模型更新视图
因此,我试图在一个简单的示例应用程序中实现MVVM模式。基本上,我的应用程序允许用户从设置页面中的搜索提供商列表中进行选择,然后在主页中,当用户单击“搜索”按钮时,他或她将被导航到搜索提供商的网站。一切正常,没有错误,除了从设置页面直接导航回主页时,搜索属性似乎没有更新。当应用程序完全退出并重新启动时,一切正常。我所拥有的如下 MainPage.xaml.csC# 如何从模型更新视图,c#,windows-phone-8,mvvm,C#,Windows Phone 8,Mvvm,因此,我试图在一个简单的示例应用程序中实现MVVM模式。基本上,我的应用程序允许用户从设置页面中的搜索提供商列表中进行选择,然后在主页中,当用户单击“搜索”按钮时,他或她将被导航到搜索提供商的网站。一切正常,没有错误,除了从设置页面直接导航回主页时,搜索属性似乎没有更新。当应用程序完全退出并重新启动时,一切正常。我所拥有的如下 MainPage.xaml.cs void search_Click(object sender, EventArgs e) { TheBrows
void search_Click(object sender, EventArgs e)
{
TheBrowser.Navigate(App.ViewModel.SearchProvider.Address);
}
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
}
}
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));
}
}
在我的设置页面中,我允许用户选择搜索提供商
设置spage.xaml.cs
void search_Click(object sender, EventArgs e)
{
TheBrowser.Navigate(App.ViewModel.SearchProvider.Address);
}
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
}
}
因此,本质上,我没有根据设置页面正确更新ViewModel,但我不确定如何正确地执行此操作。您必须调用NotifyPropertyChanged(“propertyName”)上的
才能在UI中更新项目
例如(假设名称
和地址
属性绑定到UI元素。)
我可以看到一些问题。我们从那里开始
- 您的MainViewModel需要实现
INotifyPropertyChanged
请参阅
- 您的
SearchProvider
setter需要提高PropertyChanged
- 您需要设置
SearchProvider
的值。目前,这只在构造函数中执行,这可能就是为什么您只看到在应用程序启动时工作的原因
- 您需要确保在xaml中正确绑定了
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();
}
}
我更改了ListItem类以反映这些更改,并在其中放置了一个propertyChanged处理程序,但没有任何更改?您是否放置了断点并验证了PopulateSearchProviderList方法是否实际运行?如何将此信息传递给MainViewModel?是否使用任何MVVM框架,如MVVM Light?您是否也可以将xaml发布到绑定SearchProvider的位置?