如何刷新Listview项目源?WPF Xaml



我有一个列表视图,它为我提供了参与活动的所有人员的列表。该事件是在组合框中选择的,列表视图应从列表<>中获取参与者超出数据库。。我想在每次更改选择时都这样做。我必须警告你,我对这方面还很陌生。但我已经尝试了很多来自互联网的例子和代码,但它们都不起作用。。我使用以下代码:

C#

private void cbEvenement_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
// this is he eventID extracted from the list by using the Selected index
evid = _evenementen[cbEvenement.SelectedIndex].EvenementID;
//I give the EventID to the Method in my database connector 
//to get the right participants from the right event.
aanmeldingen = Connect.EvenementAanmeldingen(evid);
// getting everything ready for the listview, i have a constructor class
foreach (var aanmelding in aanmeldingen)
{
aanmeldingclass.Add(new AanmeldingEvenement()
{
Voornaam = aanmelding.voornaam,
Achternaam = aanmelding.achternaam
});

}
// setting the itemsource
LVAanmeldingen.ItemsSource = aanmeldingclass;
// saw this on the internet. But it is not working?
CollectionViewSource.GetDefaultView(aanmeldingclass).Refresh();
}

Xaml

<ListView x:Name="LVAanmeldingen" HorizontalAlignment="Left" Height="458" Margin="3,67,0,0" VerticalAlignment="Top" Width="268" ItemsSource="{Binding AanmeldingCollection}">
<ListView.View>
<GridView>
<GridViewColumn Header="Voornaam" Width="auto" DisplayMemberBinding="{Binding Voornaam}" ></GridViewColumn>
<GridViewColumn Header="Achternaam" Width="auto" DisplayMemberBinding="{Binding Achternaam}" ></GridViewColumn>
</GridView>
</ListView.View>
</ListView>

class AanmeldingEvenement
{
public string Voornaam { get; set; }
public string Achternaam { get; set; }
}

在互联网上找到:

private ObservableCollection<AanmeldingEvenement> Aanmeldingcollection;
public ObservableCollection<AanmeldingEvenement> AanmeldingCollection
{
get
{
if (Aanmeldingcollection == null)
{
Aanmeldingcollection = new ObservableCollection<AanmeldingEvenement>();
}
return Aanmeldingcollection;
}
set
{
Aanmeldingcollection = value;
}
}

我真的被困在这里了,我只想在Listview中向我展示参与者,并在我的数据库中找到连接到事件的正确参与者

据我所知,您正在像使用WinfForms一样进行编码。对于WPF,我强烈建议您使用MVVM模式和DataBinding。否则,你会错过太多的东西,使WPF值得。

以下是我的答案(如果需要,请询问(:

我建立了两个班来管理事件和人员。我决定People将注册到不同的Events,但它可能是相反的,或者任何其他解决方案:

public class People
{
public string firstName { get; set; }
public string lastName { get; set; }
public List<Event> registeredEvents { get; set; }
public People()
{
registeredEvents = new List<Event>();
}
}
public class Event
{
public string name { get; set; }
public string anyInfo { get; set; }
}

然后我有一个EventManager,它将收集信息并进行逻辑运算。当然,你必须根据你的数据库和程序的其他部分来修改它:

public class EventManager : INotifyPropertyChanged
{
public List<Event> events { get; set; }
public List<People> peoples { get; set; }
//this is the current event that correspond to the selected event in your combobox
private Event _currentEvent;
public Event currentEvent
{
get
{
return _currentEvent;
}
set
{
if (_currentEvent != value)
{
_currentEvent = value;
//when you change the selected event, you have to update the list of participants
OnPropertyChanged("participants");
}
}
}
public List<People> participants
{
get
{
//Here is the code to retrieve the people that registered to the selected event
return peoples.Where(p => p.registeredEvents.Contains(currentEvent)).ToList<People>();
}
}
public EventManager()
{
events = new List<Event>();
peoples = new List<People>();
}
//The following lines are specific to WPF and DataBinding
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}

在这里你可以找到更多关于Databinding的信息

然后是XAML。它只依赖于DataContext:

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ComboBox ItemsSource="{Binding events}" SelectedItem="{Binding currentEvent}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding name}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<ListView Grid.Column="1" ItemsSource="{Binding participants}">
<ListView.View>
<GridView>
<GridViewColumn Header="First Name" DisplayMemberBinding="{Binding firstName}"/>
<GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding lastName}"/>
</GridView>
</ListView.View>
</ListView>
</Grid>

最后,这是我添加Data的代码。当然,你的角色应该有所不同。重要的一点是Datacontext,以及我真的不在乎ComboBoxListView

public MainWindow()
{
InitializeComponent();
EventManager eventManager = new EventManager();
Event wedding = new Event() { name = "Wedding" };
Event meeting = new Event() { name = "Meeting with LunaStar" };
Event skiSession = new Event() { name = "Skiing in Oklahoma" };
People bob = new People() { firstName = "Bob", lastName = "Raz." };
People irina = new People() { firstName = "Irina", lastName = "Politov." };
People kumamoto = new People() { firstName = "Kumamoto", lastName = "San" };
bob.registeredEvents.Add(wedding);
bob.registeredEvents.Add(meeting);
bob.registeredEvents.Add(skiSession);
irina.registeredEvents.Add(wedding);
irina.registeredEvents.Add(meeting);
kumamoto.registeredEvents.Add(meeting);
kumamoto.registeredEvents.Add(skiSession);
eventManager.peoples = new List<People>() { bob, irina, kumamoto };
eventManager.events = new List<Event>() { wedding, meeting, skiSession };
DataContext = eventManager;
}

最新更新