【问题标题】:windows phone 8.1 listview with item template带有项目模板的 windows phone 8.1 listview
【发布时间】:2015-02-28 16:54:24
【问题描述】:

我想在 Windows Phone 8.1 应用程序中显示一个列表。我添加了列表视图并创建了项目模板。

 <ListView x:Name="history" HorizontalAlignment="Left" Height="397" VerticalAlignment="Top" Width="381">
                    <ListView.Resources>
                        <DataTemplate x:Key="myCell">
                            <Grid x:Name="myGrid" Height="161" Width="389">
                                <TextBlock x:Name="title" HorizontalAlignment="Left" Margin="34,13,0,0" TextWrapping="Wrap" Text="Title" VerticalAlignment="Top" Height="52" Width="170" FontSize="48"/>
                                <TextBlock x:Name="content" HorizontalAlignment="Left" Margin="34,70,0,0" TextWrapping="Wrap" Text="content" VerticalAlignment="Top" Height="81" Width="345" FontSize="36"/>
                            </Grid>
                        </DataTemplate>
                    </ListView.Resources>
                    <ListView.ItemTemplate>
                        <StaticResource ResourceKey="myCell"/>
                    </ListView.ItemTemplate>
                </ListView>

我想以编程方式添加项目。类似的东西

myCell mm = new myCell();
mm.title.Text = "title";
mm.content.Text = "content";
history.Items.Add(mm);

但我无法访问 myCell。任何人都可以帮助我吗?

【问题讨论】:

    标签: listview windows-phone-8.1


    【解决方案1】:

    由于您使用的是 ItemTemplate,因此您需要使用 Model 创建项目并将其添加到 ListView。

    public class MyModel
    {
        public string title {get; set;}
        public string content {get; set;}
    }
    

    然后像这样添加项目:

    var item = new MyModel();
    item.title = "some title";
    item.content = "some content";
    
    history.Add(item);
    

    编辑

    实际上最好的方法是创建ObservableCollection&lt;T&gt; 并将其设置为代码中某处ListView 的ItemsSource。例如,您可以使用 ListView 的 Loaded 事件:

    history_Loaded(object sender, RoutedEventArgs e)
    {
        var historyCollection = new ObservableCollection<MyModel>();
        history.ItemsSource = historyCollection;
    }
    

    然后只需将项目添加到此 ObservableCollection 中,它们就会显示出来,因为它会在更改时向 ListView 报告。

    并且您的TextBlock 必须通过绑定定义Text 属性:

    <TextBlock Text="{Binding title}"/>
    

    要了解有关ObservableCollection&lt;T&gt; 及其与List&lt;T&gt; 的区别的更多信息,您可能需要阅读此内容-http://www.codeproject.com/Articles/42536/List-vs-ObservableCollection-vs-INotifyPropertyCha

    【讨论】:

    • 谢谢,但是当我添加一个项目时,文本没有改变。它看起来像静态模板文本
    • @ArnasLiudžius,我会编辑我的答案以包括显示新项目的解决方案。
    • 感谢您的回答,但文字仍然没有改变。 Item.title 和 content 不引用我在模板中创建的文本块(我认为是这样)
    • @ArnasLiudžius 定义Binding并使用INotifyPropertyChanged,你也可以看看this post
    • @ArnasLiudžius,对不起!忘记了xaml部分。再次编辑答案。
    【解决方案2】:

    数据绑定有两个目的:你需要在你的代码中提供数据,你需要从 Xaml 绑定到它。如果你只做一个,那么就没有联系。

    要从代码中提供数据,您需要创建数据对象的集合并将其放置在 ListView 可以看到的上下文中。我们可以直接将其设置为 ListView 的 ItemsSource,也可以将 ItemsSource 绑定到 ListView 的 DataContext。您选择的位置取决于您希望共享此数据的程度。通常,您会为 Page 设置一个整体 DataContext 并让 ListView 绑定到它的子集,但为简单起见,我们只需将其设置为 ListView 的 DataContext:

    class myCell
    {
        public string Title { get; set; }
        public string Content { get; set; }
    }
    
    public sealed partial class MainPage : Page
    {
        // Create a collection of myCells. ObservableCollection will fire
        // change notifications so we can add new cells later and the binding
        // will update
        ObservableCollection<myCell> myCells = new ObservableCollection<myCell>();
        public MainPage()
        {
            this.InitializeComponent();
    
            this.NavigationCacheMode = NavigationCacheMode.Required;
    
            // Generate some dummy data
            for (int i=0;i<100;i++)
            {
                myCells.Add(new myCell() { Title = "Cell " + i, Content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." });
            }
    
            // Set the cells to the Page's DataContext. All controls on 
            // the page will inherit this.
            this.DataContext = myCells;
        }
    }
    

    一旦我们有了数据,我们就需要从 Xaml 绑定到它。您现有的模板具有标题和内容的 TextBlocks,但它明确设置 Text 属性,而不是绑定到列出的对象。为了解决这个问题,我们需要更改 TextBlocks 的 Text 属性以绑定到由模板表示的项目的 Title 和 Context。原来的模板太大了,不太适合,所以我重新组织了一下。还要注意 ListView 中添加的 ItemsTemplate={Binding}:

    <ListView x:Name="history" ItemsSource="{Binding}">
        <ListView.Resources>
            <DataTemplate x:Key="myCell">
                <StackPanel>
                    <TextBlock x:Name="title" HorizontalAlignment="Left"  TextWrapping="Wrap" Text="{Binding Title, Mode=OneTime}" VerticalAlignment="Top" Style="{StaticResource TitleTextBlockStyle}" />
                    <TextBlock x:Name="content" HorizontalAlignment="Left"  TextWrapping="Wrap" Text="{Binding Content, Mode=OneTime}" VerticalAlignment="Top" Style="{StaticResource BodyTextBlockStyle}"  />
                </StackPanel>
            </DataTemplate>
        </ListView.Resources>
        <ListView.ItemTemplate>
            <StaticResource ResourceKey="myCell"/>
        </ListView.ItemTemplate>
    </ListView>
    

    有关详细信息,请参阅 MSDN 上的 Data binding overview (XAML),尤其是 Binding to Collections 部分。

    【讨论】:

    • 感谢您的回答:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多