C# 如何从模型更新视图

C# 如何从模型更新视图,c#,windows-phone-8,mvvm,C#,Windows Phone 8,Mvvm,因此,我试图在一个简单的示例应用程序中实现MVVM模式。基本上,我的应用程序允许用户从设置页面中的搜索提供商列表中进行选择,然后在主页中,当用户单击“搜索”按钮时,他或她将被导航到搜索提供商的网站。一切正常,没有错误,除了从设置页面直接导航回主页时,搜索属性似乎没有更新。当应用程序完全退出并重新启动时,一切正常。我所拥有的如下 MainPage.xaml.cs void search_Click(object sender, EventArgs e) { TheBrows

因此,我试图在一个简单的示例应用程序中实现MVVM模式。基本上,我的应用程序允许用户从设置页面中的搜索提供商列表中进行选择,然后在主页中,当用户单击“搜索”按钮时,他或她将被导航到搜索提供商的网站。一切正常,没有错误,除了从设置页面直接导航回主页时,搜索属性似乎没有更新。当应用程序完全退出并重新启动时,一切正常。我所拥有的如下

MainPage.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
        }
    }
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的位置?