【问题标题】:Add Item to ObservableCollection将项目添加到 ObservableCollection
【发布时间】:2015-07-13 04:24:36
【问题描述】:

我有一个文本框,其文本内容具有与视图模型的数据绑定。 我需要将 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);
  }
}

【问题讨论】:

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


【解决方案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.
}

【讨论】:

  • 我认为异步添加到 ObservableCollection 会导致异常?例如“这种类型的 CollectionView 不支持从不同于 Dispatcher 线程的线程更改其 SourceCollection。”在这种情况下,这不是一个问题吗?
  • 可能不需要添加额外的属性 - 在 Note 中编写 Clone() 方法并使用它_notes.Add(note.Clone()) 也应该可以解决问题.
  • @user2588666 OP发布的方法仍然是同步的,在这种情况下async关键字不会改变任何东西。当然,在哪个线程上调用它取决于代码的恢复。另请注意,标记方法 async (在这种情况下不需要)不会使该方法在不同的线程上运行,即使 await 关键字也会存在 - 使您的方法异步不会' 并不意味着它将立即在不同的线程上运行。
  • 如果命令或 addNote 是在后台线程上执行的,那么是的,如果不是,那么应该没问题。在这种情况下使用 System.Windows.Threading.Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => { AddNote("") })
  • @Vidas Vasiliauskas,我需要使用异步,因为我需要在 AddNote 中执行另一个任务:await saveNoteDataAsync();
猜你喜欢
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
相关资源
最近更新 更多