将项添加到ObservableCollection

时间:2015-05-03 20:28:55

标签: c# xaml data-binding windows-phone-8.1 observablecollection

我有一个TextBox,Text内容具有绑定到View Model的数据。 我需要将TextBox中的不同字符串保存到一个集合,但似乎它总是将最后一个当前TextBox的文本复制到所有项目。虽然每次我输入不同的文字。

以下是XAML中的代码:

<TextBox HorizontalAlignment="Left"
                 Background="Transparent"
                 Margin="0,81,0,0" 
                 TextWrapping="Wrap" 
                 Text="{Binding Note.NoteTitle, Mode=TwoWay}" 
                 VerticalAlignment="Top" 
                 Height="50" Width="380" 
                 Foreground="#FFB0AEAE" FontSize="26"/>

在视图模型中,我有:

public Note Note 
{
    get { return _note; }
    set { Set(() => Note, ref _note, value); }
}

private ObservableCollection<Note> _notes;

public async void AddNote(Note note)
{
    System.Diagnostics.Debug.WriteLine("AddNote Called...");
    _notes.Add(note);
}

我的页面中有一个按钮,点击它时会调用AddNote。

是否有解决方案我可以将不同的项目保存到_notes?

编辑: 更多信息:AddNote为异步的原因是我需要在里面调用另一个任务来保存笔记数据:

private async Task saveNoteDataAsync()
{
  var jsonSerializer = new DataContractJsonSerializer(typeof(ObservableCollection<Note>));
  using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync(fileName,
      CreationCollisionOption.ReplaceExisting))
  {
    jsonSerializer.WriteObject(stream, _notes);
  }
}

1 个答案:

答案 0 :(得分:1)

您正在尝试反复推送相同的Note对象实例。 AddNote命令应该只接受字符串参数并在添加之前创建一个新的注释。

<TextBox HorizontalAlignment="Left"
                 Background="Transparent"
                 Margin="0,81,0,0" 
                 TextWrapping="Wrap" 
                 Text="{Binding NoteTitle, Mode=TwoWay}" 
                 VerticalAlignment="Top" 
                 Height="50" Width="380" 
                 Foreground="#FFB0AEAE" FontSize="26"/>

private string _NoteTitle;
public string NoteTitle
{
    get { return _NoteTitle; }
    set { _NoteTitle= value; }
}

private ObservableCollection<Note> _notes;

public async void AddNote(string NoteName)
{
    System.Windows.Threading.Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() =>
    {
        System.Diagnostics.Debug.WriteLine("AddNote Called...");
        _notes.Add(new Note() {NoteTitle = NoteName});
    });
    // your async calls etc.
}