在主页面上将文件内容显示为标题,而不是FileName

时间:2014-05-07 02:37:26

标签: c# windows-phone-8 listbox isolatedstorage

我想创建一个应用程序,其中有一个显示所有笔记的主页面,您可以创建新笔记或从列表中选择一个笔记。

现在,它显示所有文件名,例如Sample1.txt,Sample2.txt。

我希望它显示如下:


这是很棒的应用程序。

提醒我买牛奶

不喜欢这样:


Sample1.txt

Sample2.txt

Sample3.txt

Sample4.txt

以下是显示列表的代码:

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
    { 
        using (var store = System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication()) 
        { 
            this.NotesListBox.ItemsSource = store.GetFileNames(); 
        } 
    } 

这是主xaml上的绑定

    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <ListBox x:Name="NotesListBox" SelectionChanged="Notes_SelectionChanged">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <TextBlock Text="{Binding}" />
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>

我很想知道这个......谢谢!

1 个答案:

答案 0 :(得分:0)

非常快速且非常脏的解决方案是替换

this.NotesListBox.ItemsSource = store.GetFileNames(); 

var filesNames = store.GetFileNames();
var titles = new List<string>();
foreach (var fileName in fileNames)
{
    using (var sr = new StreamReader(new IsolatedStorageFileStream(fileName, FileMode.Open, isf)))
    {
        titles.Add(sr.ReadLine());
    }
}
this.NotesListBox.ItemsSource = titles;

这样您的列表框将列出所有文件的第一行。

此解决方案的问题是,列表框中的项目与文件之间存在链接。更好的解决方案是为您的笔记引入一个模型,例如:

public class Note
{
    public string Title { get; set; }
    public string Content { get; set; }
    public string FileName { get; set; }
}

您可以使用此模型加载所有笔记并将其放在列表框中,如下所示:

// put this in your view class
private List<Note> _notes;

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
{ 
    _notes = new List<Note>();
    var filesNames = store.GetFileNames();
    foreach (var fileName in fileNames)
    {
        using (var sr = new StreamReader(new IsolatedStorageFileStream(fileName, FileMode.Open, isf)))
        {
            var note = new Note();
            note.FileName = fileName;
            note.Title = sr.ReadLine();
            note.Body = sr.ReadToEnd();
            _notes.Add(note);
        }
    }
    this.NotesListBox.ItemsSource = _notes;
} 

在您的xaml中,您需要替换

<TextBox Text="{Binding}"/>

<TextBox Text="{Binding Title}"/>

SelectionChanged处理程序中,您现在可以参考如下注释:

private void Notes_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    foreach (Note note in e.AddedItems)
    {
        MessageBox.Show(note.Body);
    }
}

更好的解决方案是使用。但是现在可能还有太长的时间了。

祝你好运!