0

Есть такой DataGrid

<DataGrid Grid.Row="1" x:Name="DGStudents" Margin="10" IsReadOnly="True" 
              AutoGenerateColumns="False" ItemsSource="{Binding Path=studends}">
    &lt;DataGrid.Columns&gt;
        &lt;DataGridTextColumn Header=&quot;Студент&quot; Width=&quot;*&quot; Binding=&quot;{Binding Path=FullName}&quot;/&gt;
        &lt;DataGridTextColumn Header=&quot;Группа&quot; Width=&quot;*&quot; Binding=&quot;{Binding Path=Group}&quot;/&gt;
        &lt;DataGridTextColumn Header=&quot;Курс&quot; Width=&quot;*&quot; Binding=&quot;{Binding Path=Course}&quot;/&gt;
    &lt;/DataGrid.Columns&gt;

    &lt;DataGrid.RowDetailsTemplate&gt;
        &lt;DataTemplate&gt;
            &lt;Grid&gt;
                &lt;Grid.ColumnDefinitions&gt;
                    &lt;ColumnDefinition Width=&quot;0.25*&quot;/&gt;
                    &lt;ColumnDefinition Width=&quot;0.75*&quot;/&gt;
                &lt;/Grid.ColumnDefinitions&gt;

                &lt;ComboBox Grid.Column=&quot;0&quot; ItemsSource=&quot;{Binding Path=Exams}&quot;
                          DisplayMemberPath=&quot;Name&quot; IsEnabled=&quot;True&quot;&gt;
                &lt;/ComboBox&gt;
                &lt;Grid Grid.Column=&quot;1&quot;&gt;
                    &lt;Grid.DataContext&gt;
                        &lt;view:OrganaizerManagerVeiwModel/&gt;
                    &lt;/Grid.DataContext&gt;
                    &lt;TextBlock Text=&quot;{Binding Path=Description_of_student}&quot;/&gt;
                &lt;/Grid&gt;
            &lt;/Grid&gt;
        &lt;/DataTemplate&gt;
    &lt;/DataGrid.RowDetailsTemplate&gt;
&lt;/DataGrid&gt;

Классы для биндинга

internal class Student: PropertyChanging
{
    public string FullName { get; set; }
    public string Group { get; set; }
    public int Course { get; set; }
    public List<Exam> Exams { get; set; }
    public Student(string fullname, string group, int course)
    {
        FullName = fullname;
        Group = group;
        Course = course;
    }
}

internal class Exam { public string Name { get; set; } public string Description { get; set; }

public Exam(string name, string decr)
{
    Name = name;
    Description = decr;
}
public override string ToString()
{
    return Description;
}

}

Коллекция, которая забиндена к DataGrid

 public ObservableCollection<Student> studends { get; set; }
        = new ObservableCollection<Student>()
            {
                new Student("Ivan Petrov", "21-KB-PR2", 2) 
                    {Exams = new List<Exam>()
                        { 
                        new Exam("Math", "Perfect"),
                        new Exam("OOP", "Good"),
                        new Exam("TRPO", "Bad")
                    }
            }
        };

Вопрос. Как можно забиндить два свойства SelectedItem и Description_of_student Сами свойства:

private Exam _selected_item;
public Exam SelectedItem
{
    get =&gt; _selected_item;
    set { Set(ref _selected_item, value);
        MessageBox.Show(_selected_item.ToString()); }
}


private string description_of_student;

public string Descruption_of_student
{
    get =&gt; description_of_student;
    set =&gt; Set(ref description_of_student, value);
}

При попытке забиндить через Path у меня отображаются свойства класса Student

  • <Grid.DataContext> - это что такое и зачем? Если вы меняете DataContext, то дальнейшая привязка в нем будет искаться внутри этого класса, что задан как DataContext. У вас по сути вообще не должно быть переопределения контекста в XAML, к тому же, это нарушение MVVM. +К этому всему, я вам советую подумать над названиями переменных, ибо в C# есть правила именования, которым стоит следовать (прим: Descruption_of_student -> DescruptionOfStudent). Ну и последнее, Path= лишнее в привязках, достаточно просто {Binding Exams}. – EvgeniyZ Nov 18 '22 at 16:30
  • Имена переменных я потом поменяю это тестовый вариант программы, на счет DataContex, я в самом начале разметки объявил ко всему окну эту привязку, но мне пришлось еще раз ее использовать по втором Grid так как у меня ComboBox не видел список Exams. Такая же ситуация с TextBlock. Возможно я что-то неправильно делаю, если не мложно можете направить или дать хороший пример, который похож на мой\ –  Nov 19 '22 at 13:40
  • Ничего не понял. Как Exams связан с установкой DataContext у Grid, который инициализирует класс <view:OrganaizerManagerVeiwModel/>? Я вам даже больше скажу, если вы делаете по правилам MVVM, то это вообще не правильно. Дальше, сами свойства Description_of_student и SelectedItem где находятся? Рядом с studends или внутри класса Student? Если первое, то естественно вы так не привяжетесь, ибо если выводите коллекцию, то каждый внутренний объект будет задавать свой источник данных, тут нужен FindAncestor. – EvgeniyZ Nov 19 '22 at 14:12
  • Обязательно изучу этот механизм, а на счет DataContex у меня есть класс студента, как показано выше, и у него список Exams состоящий из класса Exam. Свойства Description_of_student и SelectedItem находятся в VM, как и сама коллекция students. Задача состоит в том, чтобы Прибиндаить к DataGrid коллекцию студентов, далее в DataGrid.RowDetailsTemplate объявить отдельный Grid и в нем прибиндить имена экзаменов из класса Exam к ComboBox, а свойство SelectedItem собствеено к атрибуту ComboBox SelectedItem, чтобы я мог отследить какой экзамен выбран и вывести –  Nov 19 '22 at 15:56
  • Description_of_student, который также надо прибиндить к TextBox, для каждого экзамена. Ивзиняюсь за столь большой текст –  Nov 19 '22 at 15:56
  • Ну тогда как и сказал выше, вам нужно найти родителя, ибо когда вы задаете вид элементу из коллекции, то DataContext у него будет автоматом объект коллекции, а не предок. <Grid.DataContext> убирайте, вам он вообще не нужен здесь, да и вообще забудьте про указание этого в XAML. Ну а {Binding Path=Description_of_student} меняете на {Binding DataContext.Description_of_student, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}. Условно говоря, мы тут ищем предка в виде DataGrid, а у него берем DataContext (наша VM), из которой и берем нужное свойство. – EvgeniyZ Nov 19 '22 at 16:06

0 Answers0