这里可能有一些解决方案,但到目前为止,我找不到解决方案。任何帮助,将不胜感激。目前我有一个对话框,我可以通过单击按钮或从文件资源管理器拖放文件来上传文件。该对话框包含一个DataGrid
,绑定到ObservableCollection<FileDetails>
。 PropertyChanged
的事件处理程序也已附加到此属性。当我通过按钮添加一个文件时,会触发PropertyChanged事件,并使用添加的文件更新UI。但是,当我将文件拖放到dataGrid时,PropertyChanged处理程序为空。PropertyChanged在拖放时为空
下面是我的ViewModel:
public class FileUploadVM : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private static ObservableCollection<FileDetails> m_DialogFiles;
public ObservableCollection<FileDetails> DialogFiles
{
get
{
return m_DialogFiles ?? new ObservableCollection<FileDetails>();
}
set
{
m_DialogFiles = value;
this.NotifyPropertyChanged(nameof(DialogFiles));
}
}
public ICommand FileUpload
{
get
{
return new SimpleCommand(AddFiles);
}
}
private void AddFiles(object obj)
{
OpenFileDialog openFile = new OpenFileDialog();
openFile.Multiselect = true;
if (openFile.ShowDialog() == true)
{
m_fileList = openFile.FileNames.ToList();
GetFileWithIcon();
}
DialogFiles = new ObservableCollection<FileDetails>(dgFiles);
}
}
下面是我的XAML代码
<Grid ShowGridLines="False">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition />
</Grid.RowDefinitions>
<DataGrid x:Name="dataGrid1" Height="100" ItemsSource="{Binding Path=DialogFiles, UpdateSourceTrigger=PropertyChanged}" CanUserAddRows="False" AutoGenerateColumns="False"
GridLinesVisibility="None" CanUserDeleteRows="True" HeadersVisibility="None" AllowDrop="True" Drop="dataGrid1_Drop">
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding FileIcon}" Height="20" Width="20"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Binding="{Binding FileName}" Width="Auto"></DataGridTextColumn>
<DataGridTemplateColumn Width="Auto">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Command="Delete">
<Image Source="/AssemblyName;component/Resources/delete_icon.png" Height="15" Width="20"/>
</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right">
<Button Width="60" Margin="10" Command="{Binding Path=FileUpload}">Add Files</Button>
<Button Width="60" Margin="10">Upload</Button>
</StackPanel>
</Grid>
一个组成部分,这是代码隐藏
public partial class FileDialog : Window
{
private ObservableCollection<FileDetails> m_fileDialog;
public FileDialog()
{
InitializeComponent();
this.DataContext = FileUpload;
}
public FileUploadVM FileUpload
{
get
{
return new FileUploadVM();
}
}
public ObservableCollection<FileDetails> DialogFiles
{
get
{
return m_fileDialog ?? FileUpload.DialogFiles;
}
}
private void dataGrid1_Drop(object sender, DragEventArgs e)
{
string[] droppedFiles = null;
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
droppedFiles = e.Data.GetData(DataFormats.FileDrop, true) as string[];
}
if ((null == droppedFiles) || (!droppedFiles.Any()))
{
return;
}
foreach (var item in droppedFiles)
{
FileUploadVM.m_fileList.Add(item);
}
FileUpload.GetFileWithIcon();
FileUpload.DialogFiles = new ObservableCollection<FileDetails>(FileUploadVM.dgFiles);
FileUploadVM.m_fileList.Clear();
}
}
如上点击AddFiles作品提到不错,但拖放不会触发PropertyChanged,尽管DialogFiles内有值。
property'FileUpload'在每次调用*时创建一个新的intance *。你使用多个实例而不是1 – ASh
请看下面的答案,你不需要在该属性上触发NotifyChange,因为它是一个ObservableCollection。当添加/删除/清除该集合时,它会自动通知视图该集合已更改,所以你不应该担心:) –
@ASh谢谢!我不能相信我忽略了这一点。 – Akshatha