WPF: Установка ItemSource в XAML по сравнению с кодом - позади

Так как это - 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 прокомментированный, сетка ничего не отображает. Когда я отложил его в, это отображает корректную вещь. Почему это?

6
задан Dave Clemmer 18 September 2011 в 01:12
поделиться

2 ответа

Это:

<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.

15
ответ дан 8 December 2019 в 16:02
поделиться

Когда вы связываете с DataSource в WPF, он ищет свойство контекста данных вашего окна под названием «Allroles». Ознакомьтесь с узором модели ViewModel Model-ViewModel для получения дополнительной информации о привязке данных в XAML. http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

0
ответ дан 8 December 2019 в 16:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: