如何从模型更新视图

时间:2014-04-14 23:16:54

标签: c# windows-phone-8 mvvm

所以我试图在一个简单的示例应用程序中实现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,但我不确定如何正确地解决这个问题。

2 个答案:

答案 0 :(得分:0)

您必须在UI中调用要更新的项目OnNotifyPropertyChanged("propertyName")

例如(假设NameAddress属性绑定到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)

我可以看到一些问题。我们将从那里开始。

  • 您的MainViewModel需要实施INotifyPropertyChanged,请参阅here
  • 您的SearchProvider二传手需要加注PropertyChanged
  • 您需要设置SearchProvider的值。目前,这只是在构造函数中执行,这可能就是为什么你只看到在app启动时工作的原因。
  • 您需要确保正确绑定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();
    }
}