Если вы используете MVVM:
Общий подход состоит в том, чтобы хранить коллекцию серверов в ObservableCollection
и связывать это с ListView
'ItemsSource
свойство.
Если вы не используете MVVM:
Вы можете установить / обновить свойство ListView
* ItemsSource
из кода за Window
.
Также ...
Вы можете определить, как выглядят элементы и какие данные вы показываете, установив ListView
'* ItemTemplate
свойство для пользовательского DataTemplate
и делать все, что вы хотите там.
Вот и пример MVVM
Окно XAML код:
<Window x:Class="ExampleApp.ServerView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="ServerView" Height="450" Width="800">
<Grid>
<ListView ItemsSource="{Binding Servers}" SelectedItem="{Binding SelectedServer}" SelectionMode="Single">
<ListView.ItemTemplate>
<DataTemplate>
<Border Padding="5">
<StackPanel>
<TextBlock Text="{Binding CountryName, StringFormat='Country: {0}'}" />
<TextBlock Text="{Binding CityDns, StringFormat='DNS: {0}'}" />
</StackPanel>
</Border>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<Button Content="Refresh" Click="BtnRefresh_Click" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="10" Padding="10"/>
</Grid>
</Window>
Окно код за кодом:
using System.Windows;
namespace ExampleApp
{
public partial class ServerView : Window
{
private readonly ServerViewModel _model;
public ServerView()
{
InitializeComponent();
_model = new ServerViewModel();
DataContext = _model;
}
private void BtnRefresh_Click(object sender, RoutedEventArgs e)
{
_model.ReloadServers();
}
}
}
ViewModel и код класса сервера:
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace ExampleApp
{
public class ServerViewModel : INotifyPropertyChanged
{
public ObservableCollection<Server> Servers { get; set; } = new ObservableCollection<Server>();
private Server _selectedServer;
public Server SelectedServer
{
get => _selectedServer;
set
{
if(_selectedServer != value)
{
_selectedServer = value;
OnPropertyChanged();
SelectedServerChanged();
}
}
}
public void SelectedServerChanged()
{
//do whatever you need to do when the selected server changes here...
System.Console.WriteLine($"The selected server has changed: {SelectedServer.CountryName}");
}
public void ReloadServers()
{
var servers = DownloadServers();
Servers.Clear();
foreach (var server in servers)
{
Servers.Add(server);
}
}
private List<Server> DownloadServers()
{
//pretend we're downloading the list of servers here...
return new List<Server>
{
new Server { CityDns = "Some DNS", CountryName = "England" },
new Server { CityDns = "Some other DNS", CountryName = "China" },
new Server { CityDns = "Another DNS", CountryName = "United States" }
};
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public class Server
{
public string CountryName { get; set; }
public string CityDns { get; set; }
}
}
Обратите внимание, что я не использую ICommand
для нажатия кнопки refre sh, я бы обычно это делают.