C# 将ObservableCollection绑定到多个ListView无效
我是编程新手,现在很难弄清楚如何让我的ObservableCollection在WPF中的两个不同窗口中的两个不同列表视图上工作。我认为问题在于我是如何实现我的ObservableCollection的,罪魁祸首是这一行,如SoundsWindow类所示:C# 将ObservableCollection绑定到多个ListView无效,c#,wpf,listview,mvvm,observablecollection,C#,Wpf,Listview,Mvvm,Observablecollection,我是编程新手,现在很难弄清楚如何让我的ObservableCollection在WPF中的两个不同窗口中的两个不同列表视图上工作。我认为问题在于我是如何实现我的ObservableCollection的,罪魁祸首是这一行,如SoundsWindow类所示: ViewModel vm = this.DataContext as ViewModel; public partial class SoundsWindow : Window { public SoundsWindow()
ViewModel vm = this.DataContext as ViewModel;
public partial class SoundsWindow : Window
{
public SoundsWindow()
{
InitializeComponent();
this.DataContext = new ViewModel();
}
private void loadFileBtn1_Click(object sender, RoutedEventArgs e)
{
var ofd = new OpenFileDialog();
ofd.Multiselect = true;
ofd.Filter = "MP3 Files (*.mp3)|*.mp3";
var result = ofd.ShowDialog();
if (result == true)
{
ViewModel vm = this.DataContext as ViewModel;
foreach (String file in ofd.FileNames)
{
FileInfo fi = new FileInfo(file);
vm.AddFile(fi.Name, file, 1);
}
}
}
以下是my listview显示通过以下方式添加的项目的方式:
vm.AddFile(fi.Name, file, 1);
问题在于,这不会更新其他窗口上的其他listview,也不会存储任何内容
这是我的视图模型:
public class ViewModel : INotifyPropertyChanged
{
public ViewModel()
{
SoundFiles = new ObservableCollection<SoundFile>();
}
public event PropertyChangedEventHandler PropertyChanged = delegate { };
private void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
handler(this, new PropertyChangedEventArgs(name));
}
public void AddFile(string fileName, string fileLocation, int groupID)
{
SoundFile soundfile = new SoundFile { FileName = fileName, FileLocation = fileLocation, GroupID = groupID };
SoundFiles.Add(soundfile);
}
private ObservableCollection<SoundFile> soundfiles;
public ObservableCollection<SoundFile> SoundFiles
{
get { return soundfiles; }
set
{
soundfiles = value;
OnPropertyChanged("SoundFiles");
}
}
}
我的声音文件类:
public class SoundFile
{
public string FileName { get; set; }
public string FileLocation { get; set; }
public int GroupID { get; set; }
}
以及xaml:
<ListView x:Name="FilesList1" ItemsSource="{Binding SoundFiles}" HorizontalAlignment="Left" Height="379" Margin="10,35,0,0" VerticalAlignment="Top" Width="600">
<ListView.View>
<GridView>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=FileName}" Width="230"/>
<GridViewColumn Header="Location" DisplayMemberBinding="{Binding Path=FileLocation}" Width="320"/>
<GridViewColumn Header="Group" DisplayMemberBinding="{Binding Path=GroupID}" Width="40"/>
</GridView>
</ListView.View>
</ListView>
出于测试目的,另一个窗口是SoundsWindow的副本,因此不应成为问题
因为我几乎不知道我在做什么,所以我检查了所有的东西,但我很确定罪魁祸首是我如何在ObservableCollection中添加和存储东西的实现。非常感谢您的帮助。显然
this.DataContext=newviewmodel()代码>在两个窗口中都被调用。因此,您有两个视图模型实例。在窗口构造函数外创建一个窗口,并将其传递给两个窗口的DataContext。我们可以看看您用于加载窗口的代码吗?谢谢您的回复,您能告诉我如何@Clemens这样做吗。感谢您的帮助。一种简单的方法是ViewModel类中的静态属性,例如,publicstaticViewModel实例{get;}=newviewmodel()代码>。然后通过DataContext=ViewModel.instance将实例分配给窗口的DataContext代码>这正是我需要的。谢谢@Clemens你是个传奇人物。