您需要修改绑定表达式以从父页面获取。x: Bind将只使用本地DataContext,在本例中,它是模板化的项。
<ComboBox Grid.Column="0" x:Name="myTemplateComboBox" ItemsSource="{Binding ElementName=MyPage, Path=CityList }" SelectedValue="{x:Bind CityName, Mode=TwoWay}" HorizontalAlignment="Stretch" />
在本例中,我将CityList设置为公共属性,然后命名页面,以便使用
ElementName
.
您还需要启用
TwoWay
绑定,以便在用户进行更改后将值设置回数据模型。
如果使用可观察的集合而不是列表,那么可以通过修改数据模型将行添加到GridView中。我遇到了一个例外。
我还将初始用户名替换为占位符文本,这样用户就不必为了键入自己的名称而删除示例名称。
完整代码
<Page
x:Class="SOCityGridView.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:SOCityGridView"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Name="MyPage"
mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBox x:Name="txtFirstName" Grid.Row="0" Header="Enter Your Name" Text="{x:Bind currentUserData.FullName}" PlaceholderText="Sample User"/>
<TextBlock x:Name="label1" Grid.Row="1" TextWrapping="WrapWholeWords" Text="Please select all cities you have visited during the last 5 years. For each city please enter the data visited. If you visited a city multiple times, please have multiple entries for each time indicating the date visited each time." />
<TextBlock x:Name="label2" Grid.Row="2" TextWrapping="WrapWholeWords" Text="Press the + button to add rows as needed. " />
<Button x:Name="myButton" Grid.Row="3" Content="+" Click="myButton_Click" />
<GridView x:Name="myGridView" Grid.Row="4" HorizontalContentAlignment="Stretch" SelectionMode="None" ItemsSource="{x:Bind currentUserData.VisitedCities}">
<GridView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsStackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</GridView.ItemsPanel>
<GridView.ItemContainerStyle>
<Style TargetType="GridViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="HorizontalAlignment" Value="Stretch"/>
</Style>
</GridView.ItemContainerStyle>
<GridView.ItemTemplate>
<DataTemplate x:DataType="local:VisitedCity">
<Grid HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<!-- This is the line of code which has issues-->
<ComboBox Grid.Column="0" x:Name="myTemplateComboBox" ItemsSource="{Binding ElementName=MyPage, Path=CityList }" SelectedValue="{x:Bind CityName, Mode=TwoWay}" HorizontalAlignment="Stretch" />
<DatePicker Grid.Column="1" x:Name="myTemplateDatePicker" Date="{x:Bind VisitedDate, Mode=TwoWay}" />
</Grid>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
</Grid>
</Page>
和代码隐藏:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
namespace SOCityGridView
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{
//variables to use in XAML x:Bind
private UserData currentUserData = new UserData();
public List<string> CityList { get; set; } = new List<string>();
public MainPage()
{
//get latest list of cities from the server
CityList = CityNameManager.GetListOfCitiesFromServer();
//add sample data to show on the page for demo
List<VisitedCity> sampleUserVisitedCities = new List<VisitedCity>();
sampleUserVisitedCities.Add(new VisitedCity { CityName = "City1", VisitedDate = DateTime.Parse("2/2/2016") });
sampleUserVisitedCities.Add(new VisitedCity { CityName = "City2", VisitedDate = DateTime.Parse("2/2/2015") });
currentUserData.VisitedCities = new ObservableCollection<VisitedCity>(sampleUserVisitedCities);
this.InitializeComponent();
}
private void myButton_Click(object sender, RoutedEventArgs e)
{
currentUserData.VisitedCities.Add(new VisitedCity { CityName = "City1", VisitedDate = DateTime.Now });
}
}
public class UserData
{
public string FullName { get; set; }
public ObservableCollection<VisitedCity> VisitedCities { get; set; }
}
public class VisitedCity
{
public string CityName { get; set; }
public DateTimeOffset VisitedDate { get; set; }
}
public class CityNameManager
{
public static List<string> GetListOfCitiesFromServer()
{
List<string> listOfCities = new List<string>();
//code will be here to get the latest list from the server. for now we will manually return a list
listOfCities.Add("City1");
listOfCities.Add("City2");
listOfCities.Add("City3");
listOfCities.Add("City4");
listOfCities.Add("City5");
return listOfCities;
}
}
}