Так как это - WPF, он может быть похожим на большое количество кода, но не напуган, вопрос действительно прост!
У меня есть следующий XAML:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:hax="clr-namespace:hax" x:Class="hax.MainWindow"
x:Name="Window" Title="Haxalot" Width="640" Height="280">
<Grid x:Name="LayoutRoot">
<ListView ItemsSource="{Binding AllRoles}" Name="Hello">
<ListView.View>
<GridView>
<GridViewColumn Header="Name"
DisplayMemberBinding="{Binding Path=FullName}"/>
<GridViewColumn Header="Role"
DisplayMemberBinding="{Binding Path=RoleDescription}"/>
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>
У меня есть этот код - позади:
using System.Collections.ObjectModel;
using System.Windows;
namespace hax
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public ObservableCollection<Role> AllRoles { get { return m_AllRoles; } set { m_AllRoles = value; } }
private ObservableCollection<Role> m_AllRoles = new ObservableCollection<Role>();
public MainWindow()
{
this.InitializeComponent();
AllRoles.Add(new Role("John", "Manager"));
AllRoles.Add(new Role("Anne", "Trainee"));
// Hello.ItemsSource = AllRoles; // NOTE THIS ONE!
}
}
}
Если я оставляю оператор Hello.ItemSource = AllRoles
прокомментированный, сетка ничего не отображает. Когда я отложил его в, это отображает корректную вещь. Почему это?
Это:
<ListView ItemsSource="{Binding AllRoles}" Name="Hello">
означает «связывание PerficeSource
к свойству this.dataContext.allroles
« Где это
- это текущий элемент.
Hello.ItemsSource = AllRoles;
означает «связывание элементов элементов
к AN наблюдательной технике
, полный ролей», который напрямую делает то, что вы пытались сделать изначально.
Есть несколько способов сделать это в 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;
}
}
, а затем использовать родительские ведения, чтобы сказать привязку, чтобы прогуляться по логическому дереву Окно
<ListView
ItemsSource="{Binding AllRoles, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"
Name="Hello">
, что означает «посмотрите на мою приходство, пока не найдешь окна, то ищите публичную недвижимость на окне под названием Allroles».
Но лучший способ сделать это - вообще пропустить кодовую пропустить фригровку и использовать шаблон MVVM . Я бы предложил, если вы узнаете, что вы пропустите непосредственно к шаблону MVVM. Кривая обучения круче, но вы узнаете все о связывании и командах и важных, классных вещах о WPF.
Когда вы связываете с DataSource в WPF, он ищет свойство контекста данных вашего окна под названием «Allroles». Ознакомьтесь с узором модели ViewModel Model-ViewModel для получения дополнительной информации о привязке данных в XAML. http://msdn.microsoft.com/en-us/magazine/dd419663.aspx