我有两页。 i) HomePage -包含一个按钮来显示用户选择的城市(默认德里) ii) ListPage -包含列表框(所有城市都显示在这里)
因此,当用户单击主页中的按钮时,我将导航到 ListPage 以选择城市。当用户单击列表中的任何城市时,我必须关闭该 ListPage,然后所选城市应立即更新为主页中按钮的内容。
请帮助我如何完成上述任务。
我有两页。 i) HomePage -包含一个按钮来显示用户选择的城市(默认德里) ii) ListPage -包含列表框(所有城市都显示在这里)
因此,当用户单击主页中的按钮时,我将导航到 ListPage 以选择城市。当用户单击列表中的任何城市时,我必须关闭该 ListPage,然后所选城市应立即更新为主页中按钮的内容。
请帮助我如何完成上述任务。
如果您使用的是“MVVM Light”库,那么您可以像这样使用 Messenger 服务....
在选择更改后的第二页发送消息
Messenger.Default.Send<type>(message,token);
然后在第 1 页视图模型的构造函数中
Messenger.Default.Register<type>(this,token,Method);
这里的令牌应该与发件人令牌相同......
然后
void Method(type message)
{
button.content = message;
}
这将非常简单。您需要做的是,使用 NavigationService.Navigate(),然后将所选城市与主页页面 uri 并在主页页面中,使用 NavigationContext.QueryString.TryGetValue() 检索所选城市并在您的按钮。
例如,
在您的 ListPage.cs 中,
NavigationService.Navigate(new Uri("/HomePage.xaml?selectedCity=" + "Coimbatore", UriKind.Relative));
在您的 HomePage.cs 中,
string selectedCity = "";
NavigationContext.QueryString.TryGetValue("selectedCity", out selectedCity);
button.Content = selectedCity;
谢谢
基本方式是实现 PropertyChanged 订阅。
//In your HomePage class
HomePage()
{
ListPage.PropertyChanged +=this.CitySelected //Subscribe to the property changed event
}
void CitySelected(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "NewCity")
{
City selectedCity= (sender as ListPage).NewCity;
}
}
//In your ListPage class
//You should implement INotifyPropertyChanged interface:
ListPage:INotifyPropertyChanged
private city newCity;
public City NewCity
{
get{return newCity;}
set{
newCity=value;
NotifyChange("NewCity");
}
}
void CitySelected(City selected)
{
NewCity=selected;
}
public event PropertyChangedEventHandler PropertyChanged;
public delegate void PropertyChangeHandler(object sender, EventArgs data);
protected void NotifyChange(string args)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(args));
}
}
我建议您更改工作流程以使用Windows Phone Toolkit ListPicker 控件。此控件与您在手机的“设置”应用中看到的样式相匹配。ListPicker 允许用户点击所选项目并导航到为他们提供可用选项列表的另一个页面。这是一个例子
<StackPanel>
<TextBlock Text="City"/>
<toolkit:ListPicker ExpansionMode="FullScreenOnly"
FullModeHeader="CITY"
ItemsSource="{Binding Cities}"
SelectedItem="{Binding SelectedCity}">
<toolkit:ListPicker.FullModeItemTemplate>
<DataTemplate>
<TextBlock Margin="0,20" Text="{Binding Name}" TextWrapping="Wrap"/>
</DataTemplate>
</toolkit:ListPicker.FullModeItemTemplate>
</toolkit:ListPicker>
</StackPanel>
你的 DataContext 看起来像
public class ViewModel : INotifyPropertyChanged
{
public ViewModel()
{
Cities = new List<City> { new City("Denver"), new City("New York") };
}
public City SelectedCity
{
{ get return _city; }
{ _city = value; OnpropertyChanged("SelectedCity"); }
}
public IEnumerable<City> Cities { get; private set; }
}