我一直在試圖讓這個工作,但我仍然沒有運氣..基本上我使用一個ObservableColletion加載我所有的項目到一個自定義ItemTemplate的列表框。ObservableCollection不通過INotifyPropertyChanged更新
這是我的列表框XAML:
<DataTemplate x:Key="DataTemplate1">
<Grid d:DesignWidth="431" d:DesignHeight="109.333" Height="109.333" Width="431">
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu IsFadeEnabled="True" IsZoomEnabled="False">
<toolkit:MenuItem Header="Delete" Click="Delete_Click"/>
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
<Button x:Name="callPerson" Tag="{Binding ItemNumber}" Content="CALL" HorizontalAlignment="Left" Margin="-6,12,0,0" VerticalAlignment="Top" Click="callPerson_Click"/>
<Grid toolkit:TiltEffect.IsTiltEnabled="True" Margin="0,-1,-121,-3">
<TextBlock Text="{Binding ItemBody}" HorizontalAlignment="Left" VerticalAlignment="Top" Height="26" Width="387" FontSize="19" Margin="109,62,0,0" FontFamily="Segoe WP" TextTrimming="WordEllipsis">
<TextBlock.Foreground>
<SolidColorBrush Color="{StaticResource PhoneTextMidContrastColor}"/>
</TextBlock.Foreground>
</TextBlock>
<TextBlock Text="{Binding FolderID}" HorizontalAlignment="Left" TextWrapping="Wrap" VerticalAlignment="Top" Height="34" Width="496" FontSize="24" Margin="0,72,0,0" Visibility="Collapsed"/>
<TextBlock Text="{Binding ItemNumber}" HorizontalAlignment="Left" VerticalAlignment="Top" Height="28" Width="387" FontSize="21" Margin="109,34,0,0" FontFamily="Segoe WP"/>
<TextBlock Text="{Binding ItemTitle}" HorizontalAlignment="Left" VerticalAlignment="Top" Height="37" Width="387" FontSize="28" FontFamily="Segoe WP" Margin="109,0,0,0"/>
</Grid>
</Grid>
</DataTemplate>
我用XAML到我的列表框綁定,如:ItemsSource = "{Binding}"
這裏是我的INotifyPropertyChanged的:
public class Items : INotifyPropertyChanged
{
private string _ItemTitle;
public string ItemTitle
{
get { return _ItemTitle; }
set
{
_ItemTitle = value;
RaisePropertyChangedForItemTitle("ItemTitle");
}
}
private string _ItemBody;
public string ItemBody
{
get { return _ItemBody; }
set
{
_ItemBody = value;
RaisePropertyChangedForItemBody("ItemBody");
}
}
private string _FolderID;
public string FolderID
{
get { return _FolderID; }
set
{
_FolderID = value;
RaisePropertyChangedForItemFolderID("FolderID");
}
}
private string _ItemNumber;
public string ItemNumber
{
get { return _ItemNumber; }
set
{
_ItemNumber = value;
RaisePropertyChangedForItemNumber("ItemNumber");
}
}
public event PropertyChangedEventHandler ItemTitleChanged;
public void RaisePropertyChangedForItemTitle(string ItemTitle)
{
PropertyChangedEventHandler handler = ItemTitleChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(ItemTitle));
}
public event PropertyChangedEventHandler ItemBodyChanged;
public void RaisePropertyChangedForItemBody(string ItemBody)
{
PropertyChangedEventHandler handler = ItemBodyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(ItemBody));
}
public event PropertyChangedEventHandler FolderIDChanged;
public void RaisePropertyChangedForItemFolderID(string FolderID)
{
PropertyChangedEventHandler handler = FolderIDChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(FolderID));
}
public event PropertyChangedEventHandler ItemNumberChanged;
public void RaisePropertyChangedForItemNumber(string ItemNumber)
{
PropertyChangedEventHandler handler = ItemNumberChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(ItemNumber));
}
}
這是ObservableCollection:
public class AddItems : ObservableCollection<Items>
{
IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();
public AddItems()
{
string directory = "/GetItems";
string[] filenames = store.GetDirectoryNames(directory);
foreach (string filename in filenames)
{
IsolatedStorageFileStream openName = store.OpenFile("/GetItems/contactName.txt", FileMode.Open, FileAccess.Read);
IsolatedStorageFileStream openNumber = store.OpenFile("/GetItems/contactNumber.txt", FileMode.Open, FileAccess.Read);
IsolatedStorageFileStream openFolderID = store.OpenFile("/GetItems/FolderID.txt", FileMode.Open, FileAccess.Read);
IsolatedStorageFileStream openNotes = store.OpenFile("/GetItems/contactNotes.txt", FileMode.Open, FileAccess.Read);
using (StreamReader readContactName = new StreamReader(openName))
{
var contactName = readContactName.ReadLine();
using (StreamReader readContactNumber = new StreamReader(openNumber))
{
var contactNumber = readContactNumber.ReadLine();
using (StreamReader ReadFolderID = new StreamReader(openFolderID))
{
var FolderID = ReadFolderID.ReadLine();
using (StreamReader ReadContactNotes = new StreamReader(openNotes))
{
var contactNotes = ReadContactNotes.ReadLine();
Add(new Items() { ItemTitle = contactName, ItemBody = contactNotes, FolderID = FolderID, ItemNumber = contactNumber });
}
}
}
}
}
}
這是我如何將我的項目加載到列表框中:listBox.DataContext = collections.LoadItems;
我已將我的INotifyPropertyChanged和ObservableCollection添加到名爲Collections.cs的不同的類文件中,因此Collections.LoadItems。
現在我啓動應用程序,項目將加載。我點擊一個項目,然後我去編輯它,並保存內容,然後返回主頁面,列表框將顯示舊內容。現在,爲了獲得編輯後的新內容,我必須關閉應用程序並重新啓動它,並以這種方式向我顯示新內容。
這是不正確的,因爲INotifyPropertyChanged應該自動更改項目值等等,並顯示最新的內容。如果有人可以請幫我解決這個問題,因爲我真的很無能。不知道我是否做得對。
非常感謝! 謝謝!
謝謝。我已經實現了你給我的代碼,但似乎每當我回到主頁時,它仍然顯示舊的內容,直到我重新啓動應用程序。什麼可能是錯的?我有一種感覺,它需要將項目重新加載到列表框中? –
你可以檢查輸出/調試控制檯,看看是否有任何綁定錯誤? – WiredPrairie
沒有綁定錯誤。如果我保存了任何內容,它會將所有項目正確加載到ListBox中。 –