【问题标题】:WP7: Listbox item template doesn't work when edited?WP7:列表框项目模板在编辑时不起作用?
【发布时间】:2013-10-22 21:12:06
【问题描述】:

**已更新**

只是一些快速的东西,希望你们能帮助我,但我遇到了这个问题,我在混合中打开我的 wp7 项目并编辑列表框项目模板并完成它但是。我保存了所有内容并返回到 Windows 手机的 VS2010 并点击调试,但我看着手机,根本没有任何项目出现。列表框是空白的。

代码:

<ListBox  toolkit:TiltEffect.IsTiltEnabled="True" x:Name="ListBox1" FontSize="42.667" FontFamily="Segoe WP SemiLight" IsSynchronizedWithCurrentItem="False" d:LayoutOverrides="VerticalAlignment">
    <ListBox.ItemTemplate>
       <DataTemplate>
          <StackPanel x:Name="sp">           
    <toolkit:ContextMenuService.ContextMenu>
   <toolkit:ContextMenu IsZoomEnabled="False" > 
  <toolkit:MenuItem Header="Delete" Click="Delete_Click" Name="MenuItem1" />
  <toolkit:MenuItem Header="Edit" Click="Edit_Click"/>
    <toolkit:MenuItem Header="View" Click="View_Click"/>
  <toolkit:MenuItem Header="Share.." Click="Share_Click"/>
</toolkit:ContextMenu>

简要介绍 我正在制作的应用程序是一个简单的笔记应用程序,它将笔记保存到隔离存储中的文件夹中。它成功检索了这些项目,但我只想让它具有标题和简短描述。这一切都在一个项目中。我已经到了这一点,两个文本块有 ="{Binding}" 这基本上只是添加了我假设的标题,但我还添加了 ="{Binding}" 到第二个文本块,所以它基本上显示了标题两个都。有没有办法将它绑定到特定项目?像第二个文本块一样,我如何绑定它以便它在文本文件中显示第一个 12 个字符,所以基本上它只显示标题和简要说明?

【问题讨论】:

    标签: windows-phone-7 templates listbox edit


    【解决方案1】:

    也许您有仅设计时的数据? 如果您使用 Mvvm Light DataService 方法,则定义 2 个 DataService:一个用于设计时,另一个用于实时。

    只是随机假设。很高兴看到一些样本。

    UPD:你贴错了代码,这个是关于 ContextMenu 的。我在那里看不到绑定。

    但同样,一般来说,不应该有任何问题。你只是将数据反序列化为模型,比如说

    public class Note
    {
    public string Name {get; set; }
    public string Content; {get; set; }
    }
    

    然后你有 List(如果你想要像重命名这样的实时更改,甚至是 ObservableCollection)。然后你就绑定

    <TextBlock Text="{Binding Name}"/>
    <TextBlock Text="{Binding Content}"/>
    

    如果你想对 12 个字符的内容/描述有严格的限制,你可以添加任何一个转换器并且只取 ​​12 个第一个字符,或者引入新的属性

    class Note 
    {
    ***
    public string Description { get { return Content.Substring(0, 12); } }
    }
    

    UPD2: 好的,让我们从头开始。首先,MVVM 是 Wp7 应用程序的推荐模式。我相信,您可以自己搜索有关它的信息,但这里是最重要的部分:

    • 型号。保留您的数据(在您的情况下,它是注释名称和描述)。
    • 视图模型。这是抽象的观点。您在这里拥有所有逻辑,您已经准备好在此处呈现所有数据,但是 VM 不知道如何呈现数据。在您的情况下,这里会列出一份笔记。
    • 查看。这是您的用户界面的描述。在您的情况下,ListBox 会在这里。

      1. 所以,首先,创建一个新项目,然后使用 NuGet 安装最新的 Mvvm Light(例如)。安装后,您应该会看到视图模型和模型的文件夹。

      2. 创建新类 Note,就像我之前描述的那样。这将是你的模型。

      3. 现在,转到视图模型。在构造函数中,在那里添加一个笔记列表,将其命名为 ListOfNotes。手动向列表中添加几个项目并初始化它们(为 Names 和 Contents 字段添加一些随机值)。

      4. 现在,去看看吧。在文件的顶部,应该有类似 DataContext = "{Binding MainViewModel, Source={StaticResource ViewModelLocator}}" 的内容。在视图内部,添加 ListBox。应该是这样的

                 <ListBox ItemsSource="{Binding ListOfNotes}" >
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                    <StackPanel Orientation="Vertical">                                            
                                        <TextBlock Text="{Binding Name}" />
                                        <TextBlock Text="{Binding Content}" />
                                    </StackPanel>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
        

    那么,现在会发生什么。当您运行您的应用程序时,您的视图将被初始化。它将获得 MainViewModel(因为它在步骤 4 中设置为 DataContext)。在 MainViewModel 的构造函数中,将初始化 ListOfNotes(参见步骤 3)。然后,当页面加载 ListBox 时,它会尝试在 DataContext(在我们的例子中为 MainViewModel)中找到 ListOfNotes。它应该找到您的笔记列表,然后,ListBox 的每个元素都将与您的 ListOfNotes 的每个元素相关联。正如 DataTemplate 中所述,它会尝试获取 Note.Name 和 Note.Content。

    【讨论】:

    • 或者只是添加更多细节:)
    • 我感觉你愿意进一步帮助我?
    • 是的,让我们一次只关注一个问题:绑定或空列表。
    • 哈哈好吧。那么空列表可以通过在文本块文本 = 上键入 =“{Binding}” 来解决,但我猜当我在其中键入它时只是给出了一个默认绑定,它可能是存储文件夹中的文件名。所以我会说绑定位。这是我在列表框列表中添加所有项目的代码: Dim filenames As String() = myIsolatedStorage.GetFileNames(directory) ListBox1.ItemsSource = filenames 我只需要知道如何将文本单独添加到每个文本块。比如第一个文本块=文件名第二个文本块是里面的内容。那是绑定吗?
    • 正如我所说,你应该有一个模型(你要显示的数据类)。然后,列出模型并填写。 Names = GetFileName,Content = File.ReadLine(或其他东西)。然后,更新我在回答中提到的绑定:。然后,将 ItemSource 设置为 Notes 列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多