Передача данных в UserControl - PullRequest
0 голосов
/ 08 июля 2020

Я пытаюсь передать ObservableCollection<object> в UserControl через привязки XAML. Мой класс MainWindow генерирует случайный список из Student. Список сформирован правильно, затем компоненты инициализируются. В своем файле XAML я привязываю учащихся, но у класса UserControl нет данных.

MainWindow.xaml.cs

    public partial class MainWindow : Window
    {
        private ObservableCollection<object> _Students;
        public ObservableCollection<object> Students { get => GetStudents(); }

        public MainWindow()
        {
            GenerateStudentList();

            Console.WriteLine("MainWindow: Students = {0}", Students.Count);
            InitializeComponent();
        }

        private void GenerateStudentList()
        {
            for (int i = 0; i < 20; i++)
            {
                var s = Student.GenRandomStudent();
                Console.WriteLine("Student: {0} - {1} {2}, {3}", s.StudentId, s.FirstName, s.LastName, s.Age);
                Students.Add(s);
            }
        }

        private ObservableCollection<object> GetStudents()
        {
            if (_Students == null)
                _Students = new ObservableCollection<object>();

            return _Students;
        }
    }

MainWindow.xaml

<Window x:Class="StudentApp.MainWindow"
        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"
        xmlns:localCtr="clr-namespace:StudentApp.Controls"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <DockPanel>
            <Menu VerticalAlignment="Top" DockPanel.Dock="Top">
                <MenuItem Header="_File">
                    <MenuItem Header="_Abot"/>
                    <Separator/>
                    <MenuItem Header="_Exit"/>
                </MenuItem>
            </Menu>

            <StatusBar DockPanel.Dock="Bottom" Height="auto">
                <StatusBarItem Content="Status Bar"/>
            </StatusBar>
            
            <Grid DockPanel.Dock="Left" MinWidth="250">
                <localCtr:StudentListBox Students="{Binding Students}" ContentStringFormat="{}{0} Students"/>
            </Grid>

            <Grid DockPanel.Dock="Right">
                <Label Content="{Binding Students.Count}"/>
            </Grid>

        </DockPanel>
    </Grid>
</Window>

StudentListBox.xaml.cs

public partial class StudentListBox : UserControl
    {
        public ObservableCollection<Object> Students
        {
            get { return (ObservableCollection<Object>)GetValue(StudentsProperty) ; }
            set { SetValue(StudentsProperty, value); }
        }

        // Generated with 'propdp'
        public static readonly DependencyProperty StudentsProperty =
            DependencyProperty.Register(
                "Students",
                typeof(ObservableCollection<Object>),
                typeof(StudentListBox),
                new PropertyMetadata(new ObservableCollection<Object>())
            );

        /// 

        public StudentListBox()
        {
            Console.WriteLine("StudentListBox: Students = {0}", Students.Count);
            InitializeComponent();
        }
    }

StudentListBox.xaml

<UserControl x:Class="StudentApp.Controls.StudentListBox"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:StudentApp.Controls"
             mc:Ignorable="d"
             Name="StudentListBoxControl">
    <Grid>
        <Label Content="{Binding Students.Count, ElementName=StudentListBoxControl}"
               ContentStringFormat="{}{0} Students"/>
    </Grid>
</UserControl>

1 Ответ

0 голосов
/ 09 июля 2020

Я исправил свою проблему! Я забыл использовать DataContext:

        public MainWindow()
        {
            GenerateStudentList();
            this.DataContext = this; // <---- Right here!

            InitializeComponent();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...