XAML DataTemplate数据绑定

时间:2012-11-26 15:15:09

标签: c# xaml data-binding datatemplate

我正在尝试为WP8制作一个应用程序,但我不能为我的生活弄清楚数据绑定是如何工作的。我已经尝试了一些示例,看起来他们的表现与我完全一样,但似乎没有任何效果。基本上,配置文件类包含配置文件的名称和图标。我想在屏幕上显示这些配置文件的列表,其名称位于图标右侧。

当我在WP8手机模拟器中运行项目时,根本没有任何显示。如果我将DataTemplate中的元素(即源和文本)的属性更改为绝对字符串,它可以正常工作。

MainPage.xaml中:

<phone:PhoneApplicationPage ..>

<Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid.Resources>
        <DataTemplate x:Name="ProfileListTemplate">
            <StackPanel Margin="10">
                <Image Grid.Column="0" Width="50" Height="50" Source="{Binding ImageSource}" Stretch="Fill"/>
            <TextBlock Grid.Column="1" Text="{Binding ProfileName}" Margin="10" HorizontalAlignment="Left" FontSize="36"/>
            </StackPanel>
        </DataTemplate>
    </Grid.Resources>
    <phone:LongListSelector x:Name="ProfilesList" Grid.Row="1" VerticalAlignment="Top" FontSize="36" Height="535" Margin="10,0,0,0" ItemTemplate="{StaticResource ProfileListTemplate}"/>
</Grid>

</phone:PhoneApplicationPage>

MainPage.xaml.cs中:

namespace Profiles
{
    public partial class MainPage : PhoneApplicationPage
    {
        public MainPage()
        {
            InitializeComponent();

            ObservableCollection<Profile> ProfilesCollection = new ObservableCollection<Profile>();
            ProfilesCollection.Add(new Profile("Nighttime"));
            ProfilesCollection.Add(new Profile("Work"));
            ProfilesCollection.Add(new Profile("Home"));
            ProfilesList.ItemsSource = ProfilesCollection;
        }
    }
}

“个人资料”类:

namespace Profiles
{
    class Profile
    {
        public string ProfileName = "";
        public string ImageSource = "/Resources/Delete.png";

        public Profile(string name)
        {
            ProfileName = name;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

尝试将ProfileNameImageSource从字段更改为属性。

class Profile
{
    private const string DefaultImageSource = "/Resources/Delete.png";

    public string ProfileName { get; set; }
    public string ImageSource {get; set; }

    public Profile(string name)
    {
        ProfileName = name;
        ImageSource = DefaultImageSource;
    }
}

答案 1 :(得分:0)

将您的Profile类更改为属性,如下所示...

public class Profile
{
    string profileName = "";
    string imageSource = "/Resources/Delete.png";

    public string ProfileName
    {
        get
        {
            return profileName;
        }
        set
        {
            profileName = value;
        }
    }
    public string ImageSource
    {
        get
        {
            return imageSource;
        }
        set
        {
            imageSource = value;
        }
    }

    public Profile(string name)
    {
        ProfileName = name;
    }
}

随着您的逻辑越来越复杂,添加更多行为就变得相对微不足道了,如果您需要跟踪单个对象中的更改,还可以实现INotifyPropertyChanged。