![](/img/trans.png)
[英]Listview doesn't update when the ObservableCollection its bound to changes
[英]ListView bound to ObservableCollection<T> Doesn't update when Added to property
我正在構建一個文件資源管理器,當用戶DoubleClicks TreeView時會觸發此事件。 這將填充一個ObservableCollection<T>
,該ObservableCollection<T>
綁定到名為File_List
的ListView。FillCollection方法確實使用正確的Information填充FileList。
我已將其從填寫c#更改為綁定,因為我認為它將更易於維護。 謝謝你的時間。 有這樣告訴我刺穿INotifyPropertyChanged
我有與RaisedPropertyChanged
方法。
private void folderItems_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
try
{
TreeViewItem item = (TreeViewItem)folderItems.SelectedItem;
FileAttributes attr = File.GetAttributes(item.Tag.ToString());
if ((attr & FileAttributes.Directory) == FileAttributes.Directory)
{
_ViewModel.FileList = FillFileModel.FillCollection(item.Tag.ToString());
}
else
{
//Do something else
}
}
catch (Exception) { }
}
FillFileModel類
public static ObservableCollection<Files> FillCollection(string Path)
{
ObservableCollection<Files> files = new ObservableCollection<Files>();
var searchDirectory = new DirectoryInfo(Path);
try
{
Files getFile;
foreach (var file in searchDirectory.GetFiles())
{
getFile = new Files
{
FileName = file.Name,
FileSize = file.Length.ToString("#,##0 KB"),
DateModified = file.LastWriteTime,
FileType = getFileType(file.FullName)
};
files.Add(getFile);
}
}
catch (Exception)
{
}
return files;
}
綁定的屬性:
public ObservableCollection<Files> FileList
{
get { return _FileList; }
set
{
if (_FileList!=value)
{
_FileList = value;
RaisedPropertyChanged("FileList");
}
}
}
RaisedPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisedPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
PropertyChangedEventArgs args = new PropertyChangedEventArgs(propertyName);
handler(this, args);
}
}
**XAML:**
<Window.Resources>
<uc:ucNav x:Key="Nav"/>
<uc:FileExplorerViewModel x:Key="viewModel"/>
<local:FileImageConverter x:Key="ImageConverter"/>
</Window.Resources>
<ListView Width="580" Margin="205,32,9,10" x:Name="File_List" ItemsSource="{Binding Path=FileList}">
<ListView.View>
<GridView>
<GridViewColumn Width="150" Header="Name" >
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel>
<Image Source="{Binding Converter={StaticResource ImageConverter}}" Height="20" Width="20" Stretch="Fill"/>
<TextBlock x:Name="file_Name" Text="{Binding FileName}"/>
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Width="150">
<GridViewColumnHeader>
<TextBlock Text="Date Modified" />
</GridViewColumnHeader>
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock x:Name="Date_Modified" Text="{Binding DateModified}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Width="150">
<GridViewColumnHeader>
<TextBlock Text="File Type" />
</GridViewColumnHeader>
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock x:Name="File_Type" Text="{Binding FileType}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Width="130">
<GridViewColumnHeader>
<TextBlock Text="File Size" />
</GridViewColumnHeader>
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock x:Name="File_Size" Text="{Binding FileSize}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
聽起來您的DataContext設置不正確,因為您發布的其他代碼看起來正確。
在您的點擊處理程序中放置一個斷點,然后仔細檢查File_List.DataContext == _ViewModel
DataContext
通常是從父控件繼承的,如果這是最頂部的窗口,則可以從后面的代碼中進行設置。 在極少數情況下,您也可以綁定或設置該值,但是通常不建議這樣做,因為這會導致混亂和調試麻煩。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.