2015-05-03 205 views
0

我有一个文本框,其中的文本内容具有数据绑定到视图模型。 我需要将不同的字符串从TextBox保存到一个集合,但似乎总是将最后一个当前的TextBox文本复制到所有项目。虽然每次我输入不同的文字。将项目添加到ObservableCollection

这里是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); 
    } 
} 
+0

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。另见[帮助/标记]。 –

+0

为什么你的方法AddNote是“异步”? –

回答

1

您试图再次推注对象的同一实例,再次。 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. 
} 
+0

我认为异步添加到ObservableCollection会导致异常?例如“这种类型的CollectionView不支持从与分派器线程不同的线程更改其SourceCollection。”在这种情况下,这不是问题吗? – user2588666

+0

可能不需要添加其他属性 - 在* Note *中编写* Clone()*方法并使用它_notes.Add(note.Clone())'也应该解决该问题。 – Romasz

+0

@ user2588666由OP发布的方法仍然是同步的,在这种情况下,async关键字不会改变任何内容。当然,它被调用的线程取决于代码的恢复。还要注意,标记方法* async *(在这种情况下不需要)不会使该方法在不同的线程上运行,即使是* await *关键字也会存在 - 使您的方法异步并不意味着它将运行在不同的线程马上。 – Romasz