2015-05-03 243 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