Это:
<ListView ItemsSource="{Binding AllRoles}" Name="Hello">
означает «Привязать ItemsSource
к свойству this.DataContext.AllRoles
», где this
- текущий элемент.
Hello.ItemsSource = AllRoles;
означает «Привязать ItemsSource
к ObservableCollection<T>
полному ролям», что напрямую делает то, что вы пытались сделать изначально.
Есть несколько способов сделать это в xaml. Вот один из них:
public partial class MainWindow : Window
{
public MainWindow()
{
this.InitializeComponent();
var allRoles = new ObservableCollection<Role>()
allRoles.Add(new Role("John", "Manager"));
allRoles.Add(new Role("Anne", "Trainee"));
this.DataContext = allRoles;
}
}
и в xaml
<ListView ItemsSource="{Binding}" Name="Hello">
ИЛИ, альтернативно, вы можете сделать AllRoles общедоступным свойством окна
public partial class MainWindow : Window
{
public ObservableCollection<Role> AllRoles {get;private set;}
public MainWindow()
{
this.InitializeComponent();
var allRoles = new ObservableCollection<Role>()
allRoles.Add(new Role("John", "Manager"));
allRoles.Add(new Role("Anne", "Trainee"));
this.AllRoles = allRoles;
}
}
, а затем с помощью RelativeSource указать Binding для перехода по логическому дереву к окну
<ListView
ItemsSource="{Binding AllRoles, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"
Name="Hello">
Что означает: «Посмотри на мою родословную, пока не найдешь Окно, а затем найди открытое свойство в окне под названием AllRoles».
Но лучший способ сделать это - вообще пропустить чертов код и использовать шаблон MVVM. Я бы советовал, если вы узнаете, что переходите непосредственно к шаблону MVVM. Кривая обучения крутая, но вы узнаете все о связывании и командах, а также о важных, интересных вещах о WPF.