Хобрук: Ваш путь к мастерству в программировании

Привязка WPF ListView из другого списка

Сначала просмотрите мою базу данных - ССЫЛКА и мое Привязка ListView

В первом ListView я показал «TestSubjectName» из таблицы «TestSubjectsNames», и когда я выбираю элемент для отображения во втором ListView, «TestName» из таблицы «Tests», где «TestSBJNameID» == «ID» из выбранного элемента в первом ListView.

Это часть моего кода о втором ListView, но это неверно.

    private IEnumerable<Tests> testsNames;

    public IEnumerable<Tests> TestsNames
    {
        get
        {
            if (this.testsNames== null)
            {
                this.testsNames= BindingData.GetAllTestsNames;
            }
            return this.testsNames;
        }
    }

    public static IEnumerable<Tests> GetAllTestsNames
    {
        get
        {
            return new Model().TestsNames.Where(t => t.ID == FIRST-LISTVIEW-SELECTED-INDEX).Select(c => new Tests 
            {
                testNameID = c.ID,
                testName = c.TestsNames                   
            });
        }            
    }

Если у кого-то есть другое решение, как выбрать в первом ListView, чтобы отобразить элемент во втором ListView, пожалуйста, сообщите мне.


Ответы:


1

Я думаю, что есть много способов сделать то, что вы хотите, вот что я бы сделал:

В коде позади

public class TestWindow
{

    // A collection of SubjectNames to bind with the first listview
    private ObservableCollection<TestsSubjectsNames> _subjectNames;
    public ObservableCollection<TestsSubjectsNames> SubjectNames
    {
        get { return _subjectNames; }
        set
        {
           _subjectNames = value;
           NotifyPropertyChanged("SubjectNames");
        }
    }

    // A collection of Test for the second listview
    private ObservableCollection<Tests> _testNames;
    public ObservableCollection<Tests> TestNames
    {
        get { return _testNames; }
        set
        {
           _testNames= value;
           NotifyPropertyChanged("TestNames");
        }
    }

    // The current selected TestsSubjectsNames in first listview
    private TestsSubjectsNames _selectedSubjectNames;
    public TestsSubjectsNames SelectedSubjectNames
    {
        get { return _selectedSubjectNames; }
        set
        {
           _selectedSubjectNames= value;
           // Call this function in the setter
           // Will change the Collection binded to the second listview
           OnSelectedSubjectNameChanged(value);
           NotifyPropertyChanged("SelectedSubjectNames");
        }
    }

    public TestWindow()
    {
        // Initialization and set datacontext
        InitializeComponent();
        DataContext = this;

        // Initialize the suject name list for the first listview
        SubjectNames = GetAllSubjectNames();

        // Second listview empty until we select something in the first list
        // so initialize it empty
        TestNames = new ObservableCollection<Tests>();
    }

    // Will be called everyTime the selectedItem in the first listview changes
    private void OnSelectedSubjectNameChanged(TestsSubjectsNames subjectName)
    {
          // Get The list of Tests with the selected subjectName ID
          // and put the result in the observable collection
          TestNames = new ObservableCollection<Tests>(GetAllTestsNames(subjectName.ID))
    }
}

Теперь вам просто нужно правильно связать в XAML

Первый просмотр списка:

 // SelectedItem attribute very important
 <ListView  
      ItemsSource="{Binding SubjectNames}" 
      SelectedItem="{Binding SelectedSubjectNames}" >
    <ListView.ItemTemplate>
        <DataTemplate>
            <WrapPanel>
                // show a textblock with the TestsSubjectName property
                // of TestsSubjectsNames class 
                <TextBlock Text="{Binding TestsSubjectName}" />
            </WrapPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
 </ListView>

Второй список

 <ListView ItemsSource="{Binding TestNames}" >
    <ListView.ItemTemplate>
        <DataTemplate>
            <WrapPanel>
                // show a textblock with the TestName property
                // of Tests class 
                <TextBlock Text="{Binding TestName}" />
            </WrapPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
 </ListView>

В первом ListView мы связали SelectedItem с SelectedSubjectNames, и каждый раз, когда SelectedSubjectNames устанавливается, мы вызываем функцию OnSelectedSubjectNameChanged, которая изменяет коллекцию TestNames.

Поскольку TestNames привязан как itemsSource во втором ListView, каждый раз, когда вы выбираете другое имя субъекта, список имен тестов будет отображаться во втором списке.

Надеюсь, он был достаточно понятен и ответил на ваш вопрос.

18.02.2014
Новые материалы

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..