我有一个绑定到ListBox的类:
class FolderFM : INotifyPropertyChanged
{
public FolderFM(string path)
{
this.Folder = new DirectoryInfo(path);
this.Name = Folder.Name;
}
private string name;
private DirectoryInfo folder;
private ObservableCollection<FileInfo> matchingFiles;
...
public ObservableCollection<FileInfo> MatchingFiles
{
get { return matchingFiles; }
set
{
matchingFiles = value;
FireWhenPropertyChanged("MatchingFiles");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void FireWhenPropertyChanged(string property)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(property, new PropertyChangedEventArgs(property));
}
}
}
XAML代码:
<ListBox Name="lstFolders" ItemsSource="{Binding}" Style="{StaticResource FolderBoxStyle}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="25" />
</Grid.ColumnDefinitions>
<Label Content="{Binding Path=Name}" FontWeight="Bold" FontSize="13" />
<Button Content="{Binding Path=MatchingFiles, Converter={StaticResource lcc}}" Grid.Column="1" FontWeight="Bold" Foreground="Red" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
正在进行更新的代码隐藏:
private void btnAnalyze_Click(object sender, RoutedEventArgs e)
{
List<FileInfo> remainingFiles = files;
foreach (FolderFM currentFolder in folders)
{
currentFolder.MatchingFiles = new ObservableCollection<FileInfo>();
string folderName = currentFolder.Folder.Name;
string[] splitName = folderName.Split(' ');
for (int i = 0; i < remainingFiles.Count; i++)
{
if (remainingFiles[i] == null)
continue;
FileInfo fileName = remainingFiles[i];
string searchedName = fileName.Name;
matchScore = 0;
int searchCount = 0;
foreach (string part in splitName)
{
if (part.Length < 3 || part == "the")
continue;
matchScore += searchedName.Contains(part) ? 1 : 0;
searchCount += 1;
}
if (matchScore == searchCount)
{
string destination = System.IO.Path.Combine(currentFolder.Folder.FullName, fileName.Name);
if (File.Exists(destination))
continue;
Directory.Move(fileName.FullName, destination);
currentFolder.MatchingFiles.Add(remainingFiles[i]);
//lstFolders.Items.Refresh();
remainingFiles[i] = null;
}
}
}
populateFiles();
}
附加的Converter接受ObservableCollection并将其Count作为字符串返回。
应用程序正常运行且值正在更新,但更改未反映在UI上。
但是当我打电话时: lstFolders.Items.Refresh(); 用户界面得到更新。
我错过了什么/做错了什么?
我看了几个问题: WPF Binding with INotifyPropertyChanged does not update 但一直未能解决这个问题。
修改
此方法正在分配DataContext:
private void populateFolders()
{
folders = getFolders(selectedFolder.FullName);
lstFolders.ItemsSource = folders;
}
private List<FolderFM> getFolders(string path)
{
List<FolderFM> d = new List<FolderFM>();
foreach (string folder in Directory.GetDirectories(path))
{
d.Add(new FolderFM(folder));
}
return d;
}
答案 0 :(得分:0)
不要创建新的ObservableCollection
,只需将其替换为.Clear()
即可。应该这样做。
答案 1 :(得分:0)
将我的评论转换为答案:
尝试直接绑定到MatchingFiles.Count。