這裏可能有一些解決方案,但到目前爲止,我找不到解決方案。任何幫助,將不勝感激。目前我有一個對話框,我可以通過單擊按鈕或從文件資源管理器拖放文件來上傳文件。該對話框包含一個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